假设我有三个向量a,b,c
,并希望对所有组合应用函数f
。因此,我使用[A,B,C] = ndgrid(a,b,c); result = f(A,B,C)
并使用逐点评估实施f
,例如(A.^B).*C
。
但是,对第二个函数g
进行单独评估,该评估仅取决于a
和b
,而不取决于c
。因此,调用G=g(A,B)
(在我的示例中为A.^B
)会浪费时间,通过冗余地调用具有length(c)
次相同参数的函数。我可以使用单独的ndgrid
,但我希望将g
的结果存储在与A,B
和C
相同的维度中,以便我稍后可以调用h(G,A,C)
,无需进一步修改。
如何实现这一目标,以及如何通过使用嵌套for
循环减少程序来减少冗余浪费?
答案 0 :(得分:3)
您只能使用A
和B
的第一个平面进行计算,然后使用函数REPMAT复制结果,使G
的大小与其他变量:
G = g(A(:,:,1),B(:,:,1)); %# Compute one unique plane of G
G = repmat(G,[1 1 length(c)]); %# Replicate that plane for a 3-D matrix
修改强>
如果复制G
似乎可能浪费内存(即如果你正在处理非常大的矩阵),那么for循环可能是更好的方法。此外,您可以尝试在计算中使用函数BSXFUN。例如,要将2-D G
乘以3-D C
,您可以这样做:
bsxfun(@times,G,C);
最终会得到与以下结果相同的结果:
repmat(G,[1 1 length(c)]).*C;
它会节省内存吗?我无法确定,因为我不确切知道BSXFUN是如何实现的。您必须针对特定问题进行尝试,以了解哪种方法可以提高速度或内存使用率。