【问题标题】:MATLAB - avoiding loops to create a matrix based on the elements of other vectorsMATLAB - 避免循环以基于其他向量的元素创建矩阵
【发布时间】:2012-05-24 18:58:09
【问题描述】:

假设我有向量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 的每个元素都是一个向量。

有没有更优雅(可能更慢)的方法来做到这一点?

【问题讨论】:

    标签: matlab


    【解决方案1】:
    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 使用参数的每个元素作为您提供的函数句柄的参数 - 它以及相关的 cellfun 是避免循环的关键。)

    【讨论】:

    • +1 - 你用这个方法打败了我,使用 meshgrid 然后 arrayfun :)
    • 不错。假设我有一个矩阵MsomeFuncM 的列进行操作。 arrayfun 也能解决这个问题吗?
    • 在这种情况下,我的方法是使用 num2cell(M,dim) - dim 为 1 将每列转换为一个单元格 - 并将结果与​​ cellfun
    • @tmpearce - X、Y、Z 也需要是单元格吗?
    • 我很难完全理解你假设的代码,但我可以说的是 cellfun 的所有参数都需要是相同大小的单元格数组。
    【解决方案2】:

    someFunction 是这样设计的,那么它看起来是不可能的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多