有兩個矩陣;第一個是我的輸入矩陣替換矩陣中的所有數字
,而第二個(「重命名矩陣」)被用於代替的第一個
即,看着值重命名矩陣; 701必須由1代替,...,717必須由10代替,等。,使得輸入矩陣變成這樣
的?值被定義,但我沒有把它們。輸入矩陣的第二列已經排序(從上到下按升序排列),但值不連續(不是「710」:見第一張圖)。
問題是如何從前兩個獲得輸出矩陣(最後一張圖)。
有兩個矩陣;第一個是我的輸入矩陣替換矩陣中的所有數字
,而第二個(「重命名矩陣」)被用於代替的第一個
即,看着值重命名矩陣; 701必須由1代替,...,717必須由10代替,等。,使得輸入矩陣變成這樣
的?值被定義,但我沒有把它們。輸入矩陣的第二列已經排序(從上到下按升序排列),但值不連續(不是「710」:見第一張圖)。
問題是如何從前兩個獲得輸出矩陣(最後一張圖)。
在我看來,它像一個稀疏矩陣解決方案尖叫。在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));
幾乎魔術。
我沒有機會檢查今晚 - 但如果所描述的不準確的工作,應該是真的很接近......
它不工作,IM是<36x2>和LUM是<37X2>給了我一個「索引超出矩陣尺寸」。錯誤。 – 2013-02-14 10:49:25
錯誤表明IM中有一個值不會在LUM的第一列中出現。你能打印'max(IM(:))'和'max(LUM(1 :) :)'嗎?他們應該是一樣的? – Floris 2013-02-14 11:42:00
max(IM(:))和max(LUM(1,:))是相同的,並且等於799.我無意中交換了上圖中的LUM列,但是您的方法像魅力一樣工作,儘管「newMatrix」需要重塑;正如你所說的幾乎是魔術! – 2013-02-14 12:24:06
如果第一列中的值全部出現在第二列中,並且如果您只想將第二列中的值替換爲1..n
,並相應地更改第一列中的值,則可以將所有這些一個簡單的調用ismember
:
%# define "inputMatrix" here as the first array in your post
[~,newFirstColumn] = ismember(inputMatrix(:,1),inputMatrix(:,2));
要創建的輸出,你再寫入
outputMatrix = [newFirstColumn,(1:length(newFirstColumn))'];
如果M
是原始矩陣和R
是重命名矩陣,這裏的豪w ^你做
N = M;
for n = 1:size(M,1)
N(find(M==R(n,1))) = R(n,2);
end
注意,在這種情況下,你要創建與改名值的新矩陣N
。如果你喜歡,你不必這樣做。
也許你可以使用這個:[containers.Map] [1] [1]:http:// stackoverflow。com/a/3592050/2070074 – DavidK 2013-02-13 22:27:13