Matlab:如何嵌套ndgrid?

时间:2011-04-06 11:43:53

标签: matlab

假设我有三个向量a,b,c,并希望对所有组合应用函数f。因此,我使用[A,B,C] = ndgrid(a,b,c); result = f(A,B,C)并使用逐点评估实施f,例如(A.^B).*C

但是,对第二个函数g进行单独评估,该评估仅取决于ab,而不取决于c。因此,调用G=g(A,B)(在我的示例中为A.^B)会浪费时间,通过冗余地调用具有length(c)次相同参数的函数。我可以使用单独的ndgrid,但我希望将g的结果存储在与A,BC相同的维度中,以便我稍后可以调用h(G,A,C),无需进一步修改。

如何实现这一目标,以及如何通过使用嵌套for循环减少程序来减少冗余浪费?

1 个答案:

答案 0 :(得分:3)

您只能使用AB的第一个平面进行计算,然后使用函数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是如何实现的。您必须针对特定问题进行尝试,以了解哪种方法可以提高速度或内存使用率。