2016-08-17 116 views
2

我有两个矩阵,比方说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循环做到这一点,但它没有非常有效的。有没有更好的办法?任何建议将不胜感激。

+1

如果您确定它们在索引矩阵中为0和1,请检查逐元素乘法:http://www.mathworks.com/help/fixedpoint/ref/times.html – childofsoong

回答

2

如果I只有10,只写A.*I

ans = 
    0  2  0 
    0  0  6 
    7  8  0 

如果I有一些其他的数字,则仅保留元素A在同一位置Ik一般情况下会是:

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>kI<=(k+5)或您希望的任何其他逻辑语句。
这里的关键是,(I==k)产生一个逻辑输出:

ans = 
    1  0  0 
    0  0  1 
    0  1  0 

这把我们带回到第一种情况。

0

正如指出的那样,您的情况中最好的方法是通过术语乘法的简单术语。在更复杂的情况下,您必须根据取决于索引矩阵的规则更改条目,您可以访问索引矩阵指定的条目。

例如,如果你想增加一倍一个索引条目,并设置零索引条目为-1,你应该做的:

A(I==1)=2*A(I==1); 
A(I==0)=-1; 
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 
1

您可以反索引矩阵(这将隐式转换为二进制如果不是二进制还),并且这些索引设置的值为零。

A(~I) = 0 

好处是你并不需要定义新的或附加的矩阵,如果矩阵很大,这很昂贵。