我有兩個矩陣,比方說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