2014-11-06 65 views
2

我有一个矩阵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 

这里有什么问题?

+0

你不能像存取权限的矩阵。 a(n,m)期望m和n是值或数组,但不是矩阵。 – 2014-11-06 15:06:40

+0

你可以做一个循环。对你来说是奥克吗? – Rashid 2014-11-06 15:10:29

+0

For循环对我来说很清楚,但我试图用矩阵运算来完成。 – crepla 2014-11-06 15:14:16

回答

4

完美设置为bsxfun@gt创建这些元素的逻辑面具,然后logically indexa将它们设置为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集为NaNs和元素的其余not to be触及或改变的元素。

您也可以使用a(~bsxfun(@le,1:size(a,2),b(:))) = NaN来达到同样的效果。

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