Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 计算所有列排列的函数_Matlab_Matrix - Fatal编程技术网

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.