作者forloricever (sigh...)
看板MATLAB
標題Re: [討論] 不使用for迴圈的陣列運算
時間Wed Jun 5 05:34:46 2013
※ 引述《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
推 sunev:好方法。外面的bsxfun是假的..XD 06/05 07:30
→ forloricever:對耶, 直接減就好了XD ... 06/05 07:44
※ 編輯: forloricever 來自: 207.237.248.79 (06/05 07:47)
推 Anny19:我現在才看到!!謝謝兩位高手的解答,我晚點來試看看 07/24 17:00