我有两个矩阵,让我们说A
和我的索引矩阵I
,其值为1,我想取矩阵的值{{1}在相同位置,并且其值为0的情况下,我想在矩阵A
的位置放置一个0。
例如:
A
所以我想要的输出是:
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
循环来完成它,但它效率不高。有没有更好的办法?任何建议将不胜感激。
答案 0 :(得分:2)
如果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
产生逻辑输出:
custom-typings/my-awesome-module.d.ts
让我们回到第一个案例。
答案 1 :(得分:1)
您可以反转索引矩阵(如果它还不是二进制的,它将隐式转换为二进制),并将这些索引处的值设置为零。
A(~I) = 0
优点是您不需要定义新的或额外的矩阵,如果您的矩阵很大,这是很昂贵的。
答案 2 :(得分:0)
正如所指出的,在您的情况下,最好的方法是简单的术语乘法。在更复杂的情况下,您必须根据依赖于索引矩阵的规则更改条目,您可以访问索引矩阵指向的条目。
例如,如果要将单索引条目加倍并将零索引条目设置为-1,则应执行以下操作:
A(I==1)=2*A(I==1);
A(I==0)=-1;
答案 3 :(得分:0)
我非常喜欢@ 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