Matlab 计算所有列排列的函数
我有以下代码:Matlab 计算所有列排列的函数,matlab,matrix,Matlab,Matrix,我有以下代码: abs(mean(exp(1i*( a(:,1) - a(:,2) )))) 其中a是550×129双矩阵。我如何使用该代码编写代码,将a(:,1)替换为a(:,2),然后a(:,3)等等,因为我需要每一列从其他列中减去?循环,这是一个简单的技巧;让一个外循环运行所有索引,同时也运行一个内循环 a = rand(550,129); out = zeros(size(a,2),size(a,2)); for ii = 1:size(a,2) for jj = 1:size
abs(mean(exp(1i*( a(:,1) - a(:,2) ))))
其中
a
是550×129双矩阵。我如何使用该代码编写代码,将a(:,1)
替换为a(:,2)
,然后a(:,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
有点离题,但你也可以通过索引来实现
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
无循环,一行:
result = permute(abs(mean(exp(1i*bsxfun(@minus, a, permute(a, [1 3 2]))),1)), [2 3 1]);
这会将所有行差异对计算为一个3D数组,其中第二个和第三个维度是指原始2D数组中的两个行索引;然后沿第一个维度应用所需的操作;最后排列维度以产生2D数组结果。使用矩阵乘法的另一种方法:
E = exp(1i*a);
result = abs(E.'*(1./E)/size(E,1));
说明:
你可以重写这个表达式
exp(1i*( a - b) ))
作为
所以
而均值(x)
是总和(x)/n
使用它,您可以使用非常快速的矩阵乘法来完成任务
以倍频程比较不同方法的结果:
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.
是比较不同方法的代码。矩阵乘法总是赢。。。只要你有记忆:)
exp(1i*a)*(1/exp(1i*b))
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.