Re: [討論] 不使用for迴圈的陣列運算
※ 引述《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
06/05 07:30, 1F
→
06/05 07:44, , 2F
06/05 07:44, 2F
※ 編輯: forloricever 來自: 207.237.248.79 (06/05 07:47)
推
07/24 17:00, , 3F
07/24 17:00, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):