访问带有矢量索引的矩阵

时间:2014-11-06 15:04:04

标签: matlab

我有一个矩阵a(16x3)和一个矢量b(16x1)。 b显示矩阵a中有多少值每行有效。

a = magic(3)

a =

     8     1     6
     3     5     7
     4     9     2

b = [1;3;2]

b =

     1
     3
     2

我要做的是将无效值设置为NaN:

a(:,b+1:end)=NaN

结果是:

a =

     8   NaN   NaN
     3   NaN   NaN
     4   NaN   NaN

但我所期望的是:

a =

 8   NaN   NaN
 3     5     7
 4     9   NaN

这里有什么问题?

2 个答案:

答案 0 :(得分:4)

使用@gt完美设置 bsxfun 以创建这些元素的逻辑掩码,然后将 logically index 导入{{1将它们设置为a -

NaNs

针对通用a(bsxfun(@gt,1:size(a,2),b(:))) = NaN 案例的示例运行 -

m x n

此处a = 2 9 7 2 9 5 7 2 9 5 7 5 1 3 1 8 1 6 2 2 b = 1 4 3 2 a = 2 NaN NaN NaN NaN 5 7 2 9 NaN 7 5 1 NaN NaN 8 1 NaN NaN NaN 是 -

logical mask

因此,>> bsxfun(@gt,1:size(a,2),b(:)) ans = 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 用于选择 1s 设置为to be的元素,其余元素为 {{1触摸或更改了

您也可以使用NaNs获得相同的效果。

答案 1 :(得分:0)

我可以提出一个想法,

 a = magic(3);
 b = [1;3;2];

代码:

 a (repmat(b,[1 , 3]) < repmat(1 : 3 , [3 , 1])) = NaN

给出;

 a =

 8   NaN   NaN
 3     5     7
 4     9   NaN

对于矩阵大小,它将是,

 a = randi(9,[16 3]); 
 b = randi([0 3],[16 1]);

代码:

 a (repmat(b,[1 , 3]) < repmat(1 : 3 , [16 , 1])) = NaN