2013-02-13 98 views
3

有兩個矩陣;第一個是我的輸入矩陣替換矩陣中的所有數字

enter image description here

,而第二個(「重命名矩陣」)被用於代替的第一個

enter image description here

即,看着值重命名矩陣; 701必須由1代替,...,717必須由10代替,等。,使得輸入矩陣變成這樣

enter image description here

的?值被定義,但我沒有把它們。輸入矩陣的第二列已經排序(從上到下按升序排列),但值不連續(不是「710」:見第一張圖)。

問題是如何從前兩個獲得輸出矩陣(最後一張圖)。

+0

也許你可以使用這個:[containers.Map] [1] [1]:http:// stackoverflow。com/a/3592050/2070074 – DavidK 2013-02-13 22:27:13

回答

2

在我看來,它像一個稀疏矩陣解決方案尖叫。在Matlab可以創建一個稀疏矩陣使用以下命令:

SM = sparse(ri, ci, val); 

其中ri是非零元素的行索引,CI是相應的列索引,val是的值。

讓我們叫你輸入矩陣IM和你查找矩陣LUM,然後我們構建稀疏矩陣:

nr = size(LUM, 1); 
SM = sparse(ones(nr, 1), LUM(:, 1), LUM(:, 2)); 

現在,我們可以得到你的結果在單行:

newMatrix = reshape(SM(1, IM), size(IM)); 

幾乎魔術。

我沒有機會檢查今晚 - 但如果所描述的不準確的工作,應該是真的很接近......

+0

它不工作,IM是<36x2>和LUM是<37X2>給了我一個「索引超出矩陣尺寸」。錯誤。 – 2013-02-14 10:49:25

+0

錯誤表明IM中有一個值不會在LUM的第一列中出現。你能打印'max(IM(:))'和'max(LUM(1 :) :)'嗎?他們應該是一樣的? – Floris 2013-02-14 11:42:00

+0

max(IM(:))和max(LUM(1,:))是相同的,並且等於799.我無意中交換了上圖中的LUM列,但是您的方法像魅力一樣工作,儘管「newMatrix」需要重塑;正如你所說的幾乎是魔術! – 2013-02-14 12:24:06

1

如果第一列中的值全部出現在第二列中,並且如果您只想將第二列中的值替換爲1..n,並相應地更改第一列中的值,則可以將所有這些一個簡單的調用ismember

%# define "inputMatrix" here as the first array in your post 

[~,newFirstColumn] = ismember(inputMatrix(:,1),inputMatrix(:,2)); 

要創建的輸出,你再寫入

outputMatrix = [newFirstColumn,(1:length(newFirstColumn))']; 
1

如果M是原始矩陣和R是重命名矩陣,這裏的豪w ^你做

N = M; 

for n = 1:size(M,1) 
    N(find(M==R(n,1))) = R(n,2); 
end 

注意,在這種情況下,你要創建與改名值的新矩陣N。如果你喜歡,你不必這樣做。