2013-06-19 164 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);