Re: [討論] 不使用for迴圈的陣列運算

看板MATLAB作者 (sigh...)時間11年前 (2013/06/05 05:34), 編輯推噓2(201)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《Anny19 (安妮)》之銘言: 這是一個古老的 trick 了, 問題可以直接變成矩陣相乘可以飛快。 現在假設 x = [X', Y'] X Y 為你所寫的, x: 100 x 2 一般而言, x: n x m, n 是 data 筆數 m 是維度, 想要算出每個 row 之間 pair-wise distance. 最快的方法是利用 ||a - b||^2 = a'a - 2a'b + b'b 所以只要很神奇的二行 xx = x*x'; d = bsxfun(@minus, bsxfun(@plus, diag(xx), diag(xx)'), 2*xx); ( 經 sunev 發現 d = bsxfun(@plus, diag(xx), diag(xx)') - 2*xx; ) d 會是 n x n 對稱矩陣, d(i, j) = d(j, i) = ||i-th row - j-th row||^2 : 一維陣列 X/Y 為100個點的位置 x/y 分量 : X=[x1 x2 x3....x100]; : Y=[y1 y2 y3....y100]; : 有些情況下 X 和Y會跑出多餘的點 : 所以我想計算出每個點與剩餘點的距離 : 目的是想找出相鄰太近的質點,使其合併 : 我有寫出來,但總覺得用的方法太笨 : 求高手指點 : 我的程式碼: : for n=1:100 : Xtemp=X(n); : Ytemp=Y(n); : distance=(Xtemp-X).^2+(Ytemp-Y).^2; : distance=sqrt(distance); : ind=find(distance~=0 & distance<20); : if isempty(ind)==0 : X(n)=(X(n)+sum(X(ind)))/(length(ind)+1); : X(ind)=[]; : Y(ind)=[]; : end : end -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 207.237.248.79

06/05 07:30, , 1F
好方法。外面的bsxfun是假的..XD
06/05 07:30, 1F

06/05 07:44, , 2F
對耶, 直接減就好了XD ...
06/05 07:44, 2F
※ 編輯: forloricever 來自: 207.237.248.79 (06/05 07:47)

07/24 17:00, , 3F
我現在才看到!!謝謝兩位高手的解答,我晚點來試看看
07/24 17:00, 3F
文章代碼(AID): #1HhbrvjO (MATLAB)
文章代碼(AID): #1HhbrvjO (MATLAB)