将 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

但是,我很关心速度,想请你帮忙告诉我如何在不使用循环的情况下实现它。我很可能需要使用 bsxfunarrayfunrowfun,但我不确定。 感谢所有答案。

arrayfunbsxfun 并没有加快我的计算速度,如下所示:

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 版本不再因循环而变慢。我认为循环更具可读性,值得使用更具可读性的代码,或者至少将循环保留在注释中以阐明矢量化代码的作用。