计算列的所有排列的函数

时间:2017-06-25 19:37:26

标签: matlab matrix

我有这段代码:

abs(mean(exp(1i*( a(:,1) - a(:,2) ))))

其中a 550 -by- 129 双矩阵。如何使用该代码编写代码,将a(:,1)替换为a(:,2),然后替换a(:,3),依此类推,因为我需要从每列中减去每列?

4 个答案:

答案 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
相关问题