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,请查看逐元素乘法: