MATLAB - 避免循环根据其他向量的元素创建矩阵

时间:2012-05-24 18:58:10

标签: matlab

假设我有长度为x,y,z的向量n,m,l。我想使用这些向量的元素创建一个单元格矩阵Q。天真地可以使用for循环:

for i = 1:n
    for j = 1:m
        for k = 1:l
            Q{i,j,k} = someFunction(x(i), y(j), z(k));
        end
     end
end

Q的每个元素都是一个向量。

有没有更优雅(也可能更慢)的方法呢?

2 个答案:

答案 0 :(得分:6)

x=[1 2 3 4];
y=[5 6];
z=[7 8 9];
[X Y Z]=meshgrid(x,y,z);
someFunc = @(a,b,c)[a b c]; #% test function; use whatever you want
Q = arrayfun(someFunc,X,Y,Z,'UniformOutput',false);
Q{1,1,1} #% output: [1 5 7]

如果someFunction在别处定义,请使用arrayfun(@someFunction,X,Y,Z);来获取它的句柄。 (arrayfun使用参数的每个元素作为你提供的函数句柄的args - 它和相关的cellfun是避免循环的关键。)

答案 1 :(得分:1)

以这种方式设计someFunction,然后看起来不可能。

您应该更改someFunction以获取矩阵并返回矩阵。然后问题就是使用矩阵运算编写特定的someFunction。似乎不可能找到原始问题的通用解决方案,当你考虑一个特定的功能(就像我在这里建议的那样)时,它是可能的。