Arrays MATLAB中矩阵的三维输出阵列展开

Arrays MATLAB中矩阵的三维输出阵列展开,arrays,matlab,performance,computation,Arrays,Matlab,Performance,Computation,假设我有一个矩阵a=rand(n,m)。我想计算大小为nxnm的矩阵B,其中B(:,:,I)=A(:,I)*A(:,I) 产生这种情况的代码非常简单: A = rand(n,m); B = zeros(n,n,m); for i=1:m B(:,:,i) = A(:,i)*A(:,i)' end 但是,我很关心速度,我想请您帮助告诉我如何在不使用循环的情况下实现它。很可能我需要使用bsxfun、arrayfun或rowfun,但我不确定。 非常感谢您的回答。arrayfun和bsxfun在我的

假设我有一个矩阵
a=rand(n,m)
。我想计算大小为nxnm的矩阵B,其中
B(:,:,I)=A(:,I)*A(:,I)
产生这种情况的代码非常简单:

A = rand(n,m); B = zeros(n,n,m);
for i=1:m
B(:,:,i) = A(:,i)*A(:,i)'
end
但是,我很关心速度,我想请您帮助告诉我如何在不使用循环的情况下实现它。很可能我需要使用
bsxfun
arrayfun
rowfun
,但我不确定。
非常感谢您的回答。

arrayfun
bsxfun
在我的尝试中没有加速计算,如下所示:

clc;close all;
clear all;
m=300;n=400;

A = rand(n,m); B = zeros(n,n,m);
tic
for i=1:m
    B(:,:,i) = A(:,i)*A(:,i)';
end
t1=toc

C = reshape(cell2mat(arrayfun(@(k) bsxfun(@times, A(:,k), A(:,k)'), ...
    1:m, 'UniformOutput',false)),n,n,m);
 %C=reshape(C,n,n,m);
t2=toc-t1

 % t1 =0.3079
 % t2 =0.5112

arrayfun
bsxfun
在我的尝试中没有加速计算,如下所示:

clc;close all;
clear all;
m=300;n=400;

A = rand(n,m); B = zeros(n,n,m);
tic
for i=1:m
    B(:,:,i) = A(:,i)*A(:,i)';
end
t1=toc

C = reshape(cell2mat(arrayfun(@(k) bsxfun(@times, A(:,k), A(:,k)'), ...
    1:m, 'UniformOutput',false)),n,n,m);
 %C=reshape(C,n,n,m);
t2=toc-t1

 % t1 =0.3079
 % t2 =0.5112

我现在手头没有MATLAB,但我认为这段代码应该产生与循环相同的结果:

A1 = reshape(A,n,1,m);
A2 = reshape(A,1,n,m);
B = bsxfun(@times,A1,A2);
如果您有一个更新版本的MATLAB,您不再需要
bsxfun
,只需编写

B = A1 .* A2;
在旧版本上,最后一行将给出错误消息


这是否比循环快还取决于MATLAB的版本。较新的MATLAB版本在循环方面不再慢了。我认为循环更具可读性,值得使用更具可读性的代码,或者至少在注释中保留循环,以澄清矢量化代码的作用。

我现在手头没有MATLAB,但我认为此代码应该产生与循环相同的结果:

A1 = reshape(A,n,1,m);
A2 = reshape(A,1,n,m);
B = bsxfun(@times,A1,A2);
如果您有一个更新版本的MATLAB,您不再需要
bsxfun
,只需编写

B = A1 .* A2;
在旧版本上,最后一行将给出错误消息


这是否比循环快还取决于MATLAB的版本。较新的MATLAB版本在循环方面不再慢了。我认为循环更具可读性,值得使用更具可读性的代码,或者至少将循环保留在注释中,以澄清矢量化代码的作用。

您的代码非常好。我知道它很好,我的问题是,有没有一种方法可以通过不使用循环来加快它。您的代码非常好。我知道它很好,我的问题是,有没有一种方法可以通过不使用loop来加速它?我想这是因为您使用了
cell2mat
函数。我的问题正是关于这个,如何在矩阵的三维空间中输出数组乐趣。我想这是因为您使用了
cell2mat
函数。我的问题正是关于这一点,我如何在矩阵的三维空间中输出数组乐趣。正如您所说:
A1.*A2
在R2015b中不起作用,但在R2017a中起作用。谢谢!正如您所说:
A1.*A2
在R2015b中不起作用,但在R2017a中起作用。谢谢!