我有这段代码:
abs(mean(exp(1i*( a(:,1) - a(:,2) ))))
其中a
是 550 -by- 129 双矩阵。如何使用该代码编写代码,将a(:,1)
替换为a(:,2)
,然后替换a(:,3)
,依此类推,因为我需要从每列中减去每列?
答案 0 :(得分:6)
使用矩阵乘法的另一种方法:
E = exp(1i*a);
result = abs(E.'*(1./E)/size(E,1));
说明:
您可以重写表达式
exp(1i*( a - b) ))
as
exp(1i*a)/exp(1i*b)
所以
exp(1i*a)*(1/exp(1i*b))
且mean(x)
为sum(x)/n
使用它可以使用非常快速的矩阵乘法来完成任务。
Octave中不同方法之间的比较结果:
Matrix Multiplication:
Elapsed time is 0.0133181 seconds.
BSXFUN:
Elapsed time is 1.33882 seconds.
REPMAT:
Elapsed time is 1.43535 seconds.
FOR LOOP:
Elapsed time is 3.10798 seconds.
Here是用于比较不同方法的代码。
答案 1 :(得分:3)
循环,这是一个简单的技巧;让一个外循环遍历所有索引,以及一个内循环。
a = rand(550,129);
out = zeros(size(a,2),size(a,2));
for ii = 1:size(a,2)
for jj = 1:size(a,2)
out(ii,jj) = abs(mean(exp(1i*(a(:,ii)-a(:,jj)))));
end
end
答案 2 :(得分:3)
没有循环,一行:
result = permute(abs(mean(exp(1i*bsxfun(@minus, a, permute(a, [1 3 2]))),1)), [2 3 1]);
这将所有行差异计算为3D数组,其中第二维和第三维指的是原始2D数组中的两个行索引;然后沿第一维应用所需的操作;最后置换尺寸以产生2D数组结果。
答案 3 :(得分:2)
有点偏离主题,但你也可以通过索引来实现
a = rand(550,129);
c = repmat(1:size(a,2),1,size(a,2));
c(2,:) = imresize(1:size(a,2), [1 length(c)], 'nearest');
out = abs(mean(exp(1i*( a(:,c(1,:)) - a(:,c(2,:)) ))));
out = reshape(out,[size(a,2) size(a,2)]); % 129x129 format