我有一个6X4的矩阵M1
,其中只包含零。 我还有两个长度为4的一维数组Y1
和Y2
。这两个数组包含所需的索引值。现在,我希望将矩阵M1
的元素设置为1,以使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循环来实现这个功能。但是有没有更优化的方法呢?(我打算使用更大的矩阵)
我有一个6X4的矩阵M1
,其中只包含零。 我还有两个长度为4的一维数组Y1
和Y2
。这两个数组包含所需的索引值。现在,我希望将矩阵M1
的元素设置为1,以使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
以下是使用 bsxfun
的 Pavan Yalamanchili的回答 的副产品:(鼠标移到文字上可查看:)
不使用
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);
bsxfun
- 但你可以不使用offsets
来完成它。 - Shaioffset
和所有这些混乱的东西呢?bsxfun
可以让它变成一行代码! - Shaibsxfun
时玩得开心而获得了我的+1赞同。 - Shai