2013-06-19 199 views
5

我有一個6X4矩陣M1只包含零。 我也有兩個一維數組Y1Y2,每個長度爲4.這兩個數組包含所需的索引值。現在,我想設置(轉換爲1)矩陣M1的元件,使得 M1(Y1:Y2)等於1matlab中二維數組的索引

爲前:Y1=[1 2 2 1]Y2=[3 4 5 3]
然後,M1應該是

1 0 0 1 
1 1 1 1 
1 1 1 1 
0 1 1 0 
0 0 1 0 
0 0 0 0 

我可以使用for循環執行此操作。但是有沒有優化的方法來做到這一點? (我打算使用更大的矩陣)

回答

6

可能有超視距呃技術,但是這使用了元素明智的並行操作。

一個非常簡單的解決方案。感謝@Shai

>> [rows, cols] = size(M); 
>> Y1=[1 2 2 1]; Y2=[3 4 5 3]; 
>> M = bsxfun(@ge, (1:rows)', Y1) & bsxfun(@le, (1:rows)', Y2) 
M = 
    1  0  0  1 
    1  1  1  1 
    1  1  1  1 
    0  1  1  0 
    0  0  1  0 
    0  0  0  0 

不必要的複雜代碼

[rows, cols] = size(M); 
offsets = ((1 : cols) - 1) * rows 
Y1 = offsets + Y1; 
Y2 = offsets + Y2; 

M = reshape(1:numel(M), rows, cols); 
M = bsxfun(@ge, M, Y1) & bsxfun(@le, M, Y2); 
+0

大量使用bsxfun'的' - 但你可以做到這一點,而不使用'offsets' – Shai

+0

@shai還有一個錯誤,我固定它。 –

+0

我的問題的答案可以找到,如果你將鼠標懸停在我的答案的底部;-) – Shai

8

使用cumsum

>> szM = size(M1); 
>> M1(sub2ind(szM, Y1, 1:szM(2))) = 1 
M1 = 
1  0  0  1 
0  1  1  0 
0  0  0  0 
0  0  0  0 
0  0  0  0 
0  0  0  0 
>> M1(sub2ind(szM, Y2+1, 1:szM(2))) = -1 
M1 = 
1  0  0  1 
0  1  1  0 
0  0  0  0 
-1  0  0 -1 
0 -1  0  0 
0  0 -1  0 
>> M = cumsum(M,1) 
M = 
1  0  0  1 
1  1  1  1 
1  1  1  1 
0  1  1  0 
0  0  1  0 
0  0  0  0 

甲缺陷: 如果任何Y2等於6不是設置Y2+1爲-1將超過矩陣維數。
爲了解決這個問題,你可以設置爲-1 M的元素之前添加兩行:

>> cols = 1:szM(2); 
>> sel = Y2 < szM(1); 
>> M1(sub2ind(szM, Y2(sel)+1, cols(sel))) = -1 

使用bsxfun甲分拆爲Pavan Yalamanchili's answer:(懸停看:)

使用bsxfun而不offsets
M1 = bsxfun(@ge, (1:size(M1,1))', Y1) & bsxfun(@le, (1:size(M1,1))', Y2);