将 arrayfun 输出到 MATLAB 中矩阵的 trid 维度
Output arrayfun into trid dimension of the matrix in MATLAB
假设我有一个矩阵A = rand(n,m)
。我想计算大小为 n x n x m 的矩阵 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
我现在手边没有 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 版本不再因循环而变慢。我认为循环更具可读性,值得使用更具可读性的代码,或者至少将循环保留在注释中以阐明矢量化代码的作用。
假设我有一个矩阵A = rand(n,m)
。我想计算大小为 n x n x m 的矩阵 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
我现在手边没有 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 版本不再因循环而变慢。我认为循环更具可读性,值得使用更具可读性的代码,或者至少将循环保留在注释中以阐明矢量化代码的作用。