2016-03-09 28 views
0

我有一個矩陣A由1 2和3,例如,MATLAB:如何替換通過針對每行另一個值的值沒有環

A= [ 1 2 2 1; 
     3 3 1 2; 
     ... 
     ... 
     1 1 2 2] 

現在我想更換1 2 3使用不同的值在B根據它的行。例如,

B= [ 4 5 6; 
     10 20 30; 
     ... 
     ... 
     77 88 99] 

我想將A中的值替換爲B中的每一行。例如,

A= [ 1 2 2 1; replace '1 2 3' with '4 5 6' respectively 
     3 3 1 2; replace '1 2 3' with '10 20 30' respectively 
     ... 
     ... 
     1 1 2 2] replace '1 2 3' with '77 88 99' respectively 

C將是具有我想要的新分配的矩陣。

C= [ 4 5 5 4; 
     30 30 10 20; 
     ... 
     ... 
     77 77 88 88] 

我不能避免這種情況下一個循環,這裏是我能做到的最快方法:

for row_i=1:size(A,1) 
    C(row_i,:)=B(row_i,A(row_i,:)) 
end 

我討厭在MATLAB環,A和B的實際大小大,因此想知道是否有人可以重現它沒有循環將高度讚賞!

回答

0
A = [ 1 2 2 1; 
     3 3 1 2; 
     1 1 2 2]; 

B = [ 4 5 6; 
    10 20 30; 
    77 88 99]; 


C = B(sub2ind(size(col), repmat(1:size(A, 1), size(A, 2), 1).', A)); 

    4  5  5  4 
    30 30 10 20 
    77 77 88 88 

說明

您使用A指明使用其中B列。正如你所說的,你希望該行與A中的行相同。因此,我們只需要爲A的每個成員輸入B的行和列索引。

爲了讓行,我們只需要創建一個矩陣的A大小,每一行中的每個元素等於行索引。此外,我們注意避免任何幻數,並確定合適的尺寸。

rowindex = repmat(1:size(A, 1), size(A, 2), 1).' 

    1  1  1  1 
    2  2  2  2 
    3  3  3  3 

大,現在我們有,我們已經知道列。那簡直就是A

colindex = A 

    1  2  2  1 
    3  3  1  2 
    1  1  2  2 

現在我們只需要對這些標轉換爲使用sub2indB大小爲基準的絕對指標。

indices = sub2ind(size(B), rowindex, colindex) 

    1  4  4  1 
    8  8  2  5 
    3  3  6  6 

現在,我們只需要使用這些索引B並分配給C

C = B(indices) 

    4  5  5  4 
    30 30 10 20 
    77 77 88 88 
相關問題