MATLAB。修改从某个(可变)列索引开始的矩阵行

MATLAB。修改从某个(可变)列索引开始的矩阵行,matlab,matrix,vector,indexing,Matlab,Matrix,Vector,Indexing,我有一个大的数值数据矩阵,这里假设一个小矩阵 a=[1 1 1; 1 1 1] 然后我有一个指数向量 b=[4; 2] 我的目标是将向量b逐行“应用”到a,以便在可能的情况下使a的第i行的所有项目无效,这些项目落在索引大于b的第i个元素的列中 因此,我期望的输出是: c=some_smart_indexing_operation(a,b) %this is pseudo-code of course c=[1 1 1; 1 0 0] 让我逐行评论结果: 在第一行,b的第

我有一个大的数值数据矩阵,这里假设一个小矩阵

a=[1 1 1;
   1 1 1]
然后我有一个指数向量

b=[4;
   2]
我的目标是将向量
b
逐行“应用”到
a
,以便在可能的情况下使
a
的第i行的所有项目无效,这些项目落在索引大于
b
的第i个元素的列中

因此,我期望的输出是:

c=some_smart_indexing_operation(a,b) %this is pseudo-code of course
c=[1 1 1;
   1 0 0]
让我逐行评论结果:

  • 在第一行,
    b
    的第一个元素是4:having
    a
    只有3列没有元素为空

  • 在第二行,
    b
    的第二个元素是2:我应该使此行的第二个和第三个元素为空

我可以使用
for
循环执行这样的操作,因为我想知道应用一些智能索引操作或应用一些向量本机函数是否可以得到相同的结果。

您可以使用创建零一值的掩码,然后将
a
元素乘以该掩码:

c = a .* bsxfun(@lt, 1:size(a,2), b);
在Matlab R2016b之后的版本中,可以使用以下更简单的语法:

c = a .* ((1:size(a,2))<b);

这看起来很聪明。您能解释一下
bsxfun
是如何创建掩码的吗?感谢you@Marco这只是单例扩展。使用
bsxfun
和更新、更简单的语法解释这是什么
c = a;
c(bsxfun(@ge, 1:size(a,2), b)) = 0; % or c(((1:size(a,2))>=b)) = 0