我有两个矩阵,比方说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
循环做到这一点,但它没有非常有效的。有没有更好的办法?任何建议将不胜感激。
我有两个矩阵,比方说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
循环做到这一点,但它没有非常有效的。有没有更好的办法?任何建议将不胜感激。
如果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
这把我们带回到第一种情况。
正如指出的那样,您的情况中最好的方法是通过术语乘法的简单术语。在更复杂的情况下,您必须根据取决于索引矩阵的规则更改条目,您可以访问索引矩阵指定的条目。
例如,如果你想增加一倍一个索引条目,并设置零索引条目为-1,你应该做的:
A(I==1)=2*A(I==1);
A(I==0)=-1;
我非常喜欢@ 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
您可以反索引矩阵(这将隐式转换为二进制如果不是二进制还),并且这些索引设置的值为零。
A(~I) = 0
好处是你并不需要定义新的或附加的矩阵,如果矩阵很大,这很昂贵。
如果您确定它们在索引矩阵中为0和1,请检查逐元素乘法:http://www.mathworks.com/help/fixedpoint/ref/times.html – childofsoong