【问题标题】:Can I store a MATLAB slice in a variable?我可以将 MATLAB 切片存储在变量中吗?
【发布时间】:2011-07-25 16:35:18
【问题描述】:

我有一个冗长的切片序列,我需要将其应用于许多 MATLAB 矩阵。我该怎么做?

即我可以简化吗,

y(1:some_var*3,1:some_other_var*3,1:another_var*3) = x1(1:some_var*3,1:some_other_var*3,1:another_var*3) .* x2(1:some_var*3,1:some_other_var*3,1:another_var*3) ./ x3(1:some_var*3,1:some_other_var*3,1:another_var*3)

类似于,

inds = slice(1:some_var*3,1:some_other_var*3,1:another_var*3)
y(inds) = x1(inds) .* x2(inds) ./ x3(inds)

就像我在 Python 中可以做的那样?

【问题讨论】:

    标签: matlab slice


    【解决方案1】:

    在您的情况下,您可以创建一个逻辑掩码:

    %# assuming x1,x2,x3,y are all of the same size
    
    mask = false(size(x1));
    mask(1:some_var*3,1:some_other_var*3,1:another_var*3) = true;
    
    y(mask) = x1(mask).*x2(mask)./x3(mask);
    

    您可能想了解的其他函数:FINDSUB2IND

    【讨论】:

      【解决方案2】:

      一种选择是将每个索引向量存储在cell array 的单元格中,然后将单元格数组内容提取为comma-separated list,如下所示:

      inds = {1:some_var*3, 1:some_other_var*3, 1:another_var*3};
      y(inds{:}) = x1(inds{:}) .* x2(inds{:}) ./ x3(inds{:});
      

      如果您有大型矩​​阵,并且索引集相对较小/稀疏,则此方法可能using a logical mask as Amro suggested 更有效。

      【讨论】:

      • 我选择了这个作为答案,因为它可以通过准备线来实现,并演示了一些非常有趣的 MATLAB-fu,它通过单元格数组生成逗号分隔列表。
      • 有没有办法通过这种技术来使用end 运算符?
      • @Brendan:很遗憾,您将无法在元胞数组inds 的任何表达式中使用end 关键字。但是,如果要索引给定维度的所有元素,可以将单个字符串':' 放在相应的单元格中。