Matlab 选择给定索引矩阵的矩阵的某些条目?
我有两个矩阵,比如说Matlab 选择给定索引矩阵的矩阵的某些条目?,matlab,matrix,indexing,Matlab,Matrix,Indexing,我有两个矩阵,比如说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 A = magic(3) I = [1 2 3 3 2 1 2 1 3] k = 1; A.*(I==k) 我知道我可以用两个for循环来完成,但效率不高。有更好的办法吗?如果I只
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
A = magic(3)
I = [1 2 3
3 2 1
2 1 3]
k = 1;
A.*(I==k)
我知道我可以用两个
for
循环来完成,但效率不高。有更好的办法吗?如果I
只是1
和0
,请写A.*I
:
ans =
0 2 0
0 0 6
7 8 0
如果I
有一些其他数字,则仅将A
中I
的元素保持在k
中相同位置的一般情况为:
0 2 0
0 0 6
7 8 0
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,正如前面指出的,在你的例子中,最好的方法是简单的逐项乘法。在更复杂的情况下,您必须根据依赖于索引矩阵的规则更改条目,您可以访问索引矩阵所指向的条目
例如,如果要将一个索引项加倍并将零个索引项设置为-1,则应执行以下操作:
A(I==1)=2*A(I==1);
A(I==0)=-1;
我非常喜欢@EBH的答案,但这里有另一种使用逻辑的方法:
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
您可以反转索引矩阵(如果它还不是二进制的,这将隐式转换为二进制),并将这些索引处的值设置为零
A(~I) = 0
优点是您实际上不需要定义新的或附加的矩阵,如果您的矩阵很大,这将非常昂贵。如果您保证它们在索引矩阵中为0和1,请查看逐元素乘法: