簡體   English   中英

在matlab中索引2D數組

[英]Indexing of 2D array in matlab

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

例如: 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循環來做到這一點。 但有沒有優化的方法呢? (我打算使用更大的矩陣)

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將超過矩陣維度。
要解決此問題,您可以在將M的元素設置為-1之前添加兩行:

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

使用bsxfunPavan Yalamanchili的回答進行bsxfun :(懸停看:)

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

可能還有其他技術,但這使用了瘋狂並行的元素操作。

一個非常簡單的解決方 謝謝@ 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM