作者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
1F:推 sunev:好方法。外面的bsxfun是假的..XD 06/05 07:30
2F:→ forloricever:对耶, 直接减就好了XD ... 06/05 07:44
※ 编辑: forloricever 来自: 207.237.248.79 (06/05 07:47)
3F:推 Anny19:我现在才看到!!谢谢两位高手的解答,我晚点来试看看 07/24 17:00