2016-08-17 156 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 

好處是你並不需要定義新的或附加的矩陣,如果矩陣很大,這很昂貴。