假设我有一个m-by-by-p矩阵“A”,每个索引存储一个实数,现在我想创建另一个矩阵“B”和B(i,j,k)= f( A(i,j,k),i,j,k,otherVars),是否有更快的方法在matlab中进行,而不是循环遍历所有元素? (注意函数需要索引号(i,j,k))
示例如下(实际函数f可能更复杂):
A = rand(3, 4, 5);
B = zeros(size(A));
C = 10;
for x = 1:size(A, 1)
for y = 1:size(A, 2)
for z = 1:size(A, 3)
B(x, y, z) = A(x,y,z) + x - y * z + C;
end
end
end
我尝试过创建一个单元格“B”和
B{i, j, k} = [A(i, j, k), i, j, k];
然后我应用了cellfun()进行并行计算,但它比A中每个元素的for循环更慢。
在我的实际实现中,函数f比B = A + X - Y复杂得多。* Z + C;它需要四个缩放器值,我不想修改它,因为它是一个写在外部包中的函数。有什么建议吗?
答案 0 :(得分:1)
通过构建ndgrid
适当的值来对其进行矢量化:
[X,Y,Z] = ndgrid(1:size(A,1), 1:size(A,2), 1:size(A,3));
B = A + X - Y.*Z + C;