2014-11-06 59 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