【问题标题】:Select some entries of a matrix given an indexing matrix?在给定索引矩阵的情况下选择矩阵的一些条目?
【发布时间】:2016-08-17 21:38:10
【问题描述】:
我有两个矩阵,比如说A和我的索引矩阵I,其中它的值为1,我想取矩阵A的相同位置的值,它的值在哪里是0,我想在矩阵A的位置放一个0。
例如:
A=
1 2 3
4 5 6
7 8 9
I=
0 1 0
0 0 1
1 1 0
所以我想要的输出是:
0 2 0
0 0 6
7 8 0
我知道我可以使用两个 for 循环来做到这一点,但这不是很有效。有没有更好的办法?任何建议将不胜感激。
【问题讨论】:
标签:
matlab
matrix
indexing
【解决方案1】:
如果I只有1和0,就写A.*I:
ans =
0 2 0
0 0 6
7 8 0
如果I 有一些其他数字,那么只保留A 中的元素,其中I 在k 中的相同位置的一般情况是:
A = magic(3)
I = [1 2 3
3 2 1
2 1 3]
k = 1;
A.*(I==k)
还有输出:
A =
8 1 6
3 5 7
4 9 2
I =
1 2 3
3 2 1
2 1 3
ans =
8 0 0
0 0 7
0 9 0
当然,这可以更改为 I>k 或 I<=(k+5) 或您希望的任何其他逻辑语句。
这里的关键是(I==k) 产生一个逻辑输出:
ans =
1 0 0
0 0 1
0 1 0
这让我们回到第一个案例。
【解决方案2】:
您可以反转索引矩阵(如果它还不是二进制,这将隐式转换为二进制),并将这些索引处的值设置为零。
A(~I) = 0
优点是您实际上不需要定义新的或额外的矩阵,如果您的矩阵很大,这会很昂贵。
【解决方案3】:
正如所指出的,在您的情况下,最好的方法是简单的逐项乘法。在更复杂的情况下,您必须根据取决于索引矩阵的规则更改条目,您可以访问索引矩阵指向的条目。
例如,如果你想加倍索引为一的条目并将零索引的条目设置为 -1,你应该这样做:
A(I==1)=2*A(I==1);
A(I==0)=-1;
【解决方案4】:
我非常喜欢@EBH 的回答,但这是使用logical 的另一种方法:
B = zeros(size(A));
log_I = logical(I);
B(log_I) = A(log_I);
B
B =
0 2 0
0 0 6
7 8 0