我有一个冗长的切片序列,我需要应用于许多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做的那样?
答案 0 :(得分:3)
在您的情况下,您可以创建逻辑掩码:
%# 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);
答案 1 :(得分: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更有效。