2014-12-04 80 views
2

使用MATLAB,我想創建一個新矢量,其中原始矢量中的值由另一個矩陣中的相應數字替換。使用對應於單獨矩陣的值創建矢量

具體而言,我有一個大型矢量(30,000 x 1)其中每個單元格中的單個值對應於大腦中的位置(range: 0 - 166)。這些值在載體上有些隨機分佈(它們對應於大腦位置)。運行實驗之後,我現在想用實驗計算出的值替換這些值的每個實例。這些值存儲在相應的矩陣(167 x 2)中:第一列包含原始矩陣(0 - 166)的值,第二列包含我希望替換原始值(0 - 6)的新值。因此,例如,如果在我的實驗中,值150與得分5相關聯,我想用原始矩陣中的5替換150的每個實例。

原始矢量:[1; 1; 1; 1; 2; 2; 2; 2; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; ...]

單位矩陣:[0 0; 1 4; 2 5; 3 2; ...]

新載體:[4; 4; 4; 4; 5; 5; 5; 5; 4; 4; 4; 4; 4; 4; 5; 5; 5; 5; ...]

有一種簡單的方法來解決這個問題?

感謝

回答

5
originalMatrix = [1; 1; 1; 1; 2; 2; 2; 2; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 0; 3]; 
identityMatrix = [0 0; 1 4; 2 5; 3 2]; 
[~,ind] = ismember(originalMatrix,identityMatrix(:,1)); 
map = identityMatrix(:,2); 
result = map(ind); 

編輯

I keep getting this error: "Subscript indices must either be real positive integers or logicals."

這是因爲在某些originalMatrix值不具有相應identityMatrix值。

這樣你就可以忽略他們,

ind(ind==0) = []; 
+0

@mehmet ,感謝編輯。 – Rashid 2014-12-04 21:14:54

+0

不客氣。這是最重要的(( – mehmet 2014-12-04 21:18:14

+0

謝謝你們!我試了一下,但我一直得到這個錯誤: 「下標索引必須是真正的正整數或邏輯」 – 2014-12-04 21:40:40

1

我敢肯定有一個更有效的方式,但是這應該完成這項工作。 對於0-166範圍內的每個值,我找到包含該值的原始矢量分量的索引。這存儲在稱爲索引的向量中。然後我把這個新的值稱爲identity_matrix(i,2)在new_vector這個Indexes中。

new_vector = zeros(size(original_vector)); 
for i = 1:167 
    Indexes = find(original_vector == identity_matrix(i,1)); 
    new_vector(Indexes) = identity_matrix(i,2); 
end 
2
indCol=identityMatrix(:,2); 
newVector=indCol(originalVector+1) 

,或者在一個行:

newVector=identityMatrix(originalVector+168) 
+0

如果'身份矩陣'排序沒有缺失值,這將工作,很好的答案。 – Rashid 2014-12-04 22:00:21

+0

他說這是167x2。謝謝:) – Adiel 2014-12-04 22:04:47

0

下面是使用bsxfun和乘法(與數據從Kamtal的回答)一個班輪:

originalMatrix = [1; 1; 1; 1; 2; 2; 2; 2; 1; 1; 1; 1; 1; 1; 2; 2; 2; 2; 0; 3]; 
identityMatrix = [0 0; 1 4; 2 5; 3 2]; 
result = bsxfun(@eq,originalMatrix(:),identityMatrix(:,1)')*identityMatrix(:,2);