我有以下代码片段,它将 3D 数组的每个 2D 横截面乘以一个向量:
A = zeros(N,M);
for k = 1:M
B = C(:,:,k);
A(:,k) = B * f(:,k);
end
当我分析代码时,我看到对于 N=200,M = 25,这可能非常慢(相对于我代码的其他部分);特别是行:
B=C(:,:,k)
可能占用总运行时间的很大一部分。有什么方法可以加快速度吗?
您可以将bsxfun
与permute
结合使用,以执行具有单例扩展的所需乘法,然后沿适当的维度相加以计算矩阵乘法。
定义示例数据:
N = 5;
M = 4;
C = rand(N,N,M);
f = rand(N,M);
然后结果计算为
result = permute(sum(bsxfun(@times, C, permute(f,[3 1 2])),2), [1 3 2]);
作为检查,与使用循环计算的结果进行比较:
A = zeros(N,M);
for k = 1:M
B = C(:,:,k);
A(:,k) = B * f(:,k);
end
result./A
给
ans =
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1