2012-09-15 41 views
3

假設現在我有一個矩陣在MATLAB與其他值替換指數矩陣

S = [1 1 1 2 2 2; 
    1 1 1 2 2 2; 
    2 2 2 2 1 1; 
    2 2 2 2 1 1; 
    2 2 2 2 1 1] 

而另一矩陣

A = [1 2; 
    2 4] 

A中的第一行是S的唯一指標,而第二行包含第一行中的值將被替換的值。也就是說,在S中所有的「1」將由2所取代,並且所有「2」 S將4.更換最後,我會得到一個矩陣

SS = [2 2 2 4 4 4; 
     2 2 2 4 4 4; 
     4 4 4 4 2 2; 
     4 4 4 4 2 2; 
     4 4 4 4 2 2] 

現在我做什麼:

SS = zeros(size(S)); 
for i = 1:size(A,2) 
    SS(S==index(A(1, i)) = A(2,i); 
end 

現在,我有一個很大的矩陣,使用for循環有點慢。有沒有更快的方法來做到這一點?

+0

你說的 「1」 將通過 「2」 S,被替換但是'SS'仍然有 「1」 ...的錯誤呢? –

+0

@EitanT對不起,已編輯。 – luvegood

回答

3

使用ismember第二輸出,給你的指標A的第1行中的值。使用這些索引直接創建矩陣SS

實施例(爲了清楚起見改變初始值):

S = [5 5 5 3 3 3; 5 5 5 3 3 3; 3 3 3 3 5 5; 3 3 3 3 5 5; 3 3 3 3 5 5]; A = [5 3; 2 4];

>> [~, Locb] = ismember(S,A(1,:)) 
Locb = 

    1  1  1  2  2  2 
    1  1  1  2  2  2 
    2  2  2  2  1  1 
    2  2  2  2  1  1 
    2  2  2  2  1  1 

>> SS = reshape(A(2,Locb),size(S)) 
SS = 

    2  2  2  4  4  4 
    2  2  2  4  4  4 
    4  4  4  4  2  2 
    4  4  4  4  2  2 
    4  4  4  4  2  2 
+0

+1整潔。你能用我的解決方案添加執行時間的比較(我現在不在MATLAB附近)嗎? –

+0

@EitanT它比你的解決方案快100倍。但是,無論如何感謝,真的學到了很多:) – luvegood

+0

沒問題,我也學到了一些東西:) –

1

如果我已經正確理解你的問題,我會使用numpy數組而不是標準的python數組或列表。然後,如下所示的代碼變得很簡單:如果你看到陣列SS

# Import numpy 
from numpy import array, zeros, shape 
# Create the array S 
S = array([[1,1,1,2,2,2],[1,1,1,2,2,2],[2,2,2,2,1,1],[2,2,2,2,1,1],[2,2,2,2,1,1]]) 
# Create the array A 
A = array([[1,2],[2,4]]) 
# Create the empty array SS 
SS = zeros((shape(S))) 
# Actual operation needed 
SS[S==A[0,0]]=A[1,0] 
SS[S==A[0,1]]=A[1,1] 

現在,它看起來如下:

SS 
array([[ 2., 2., 2., 4., 4., 4.], 
     [ 2., 2., 2., 4., 4., 4.], 
     [ 4., 4., 4., 4., 2., 2.], 
     [ 4., 4., 4., 4., 2., 2.], 
     [ 4., 4., 4., 4., 2., 2.]]) 

很抱歉的混亂早。我有(出於某種原因)認爲這個問題是Python的(我的壞!)。不管怎麼說,對於MATLAB的回答很相似:

SS = zeros(size(S)) 
SS(S==A(1,1))=A(2,1) 
SS(S==A(1,2))=A(2,2) 
+0

謝謝,但我的標籤是「matlab」,抱歉誤解。 – luvegood

+0

對此我很抱歉。實際上,當我偶然發現這個問題時,我自己正在尋找一些關於Python/Mayavi的東西。因爲我可能知道答案,所以我只是跳過幫助而沒有看標籤。下次我會小心的。謝謝。 –

1

你可以去這與arrayfun的一行,像這樣:

SS = arrayfun(@(x)A(2, (A(1, :) == x), S) 
+0

然而,非常感謝,如果矩陣S中的指數不連續,例如S中的「2」是「3」。如果發生這種情況,我想我只能改變矩陣A來添加一些條目,以便使用您的建議代碼。還有另一種方法可以做到嗎? – luvegood

+0

我的意思是,對於一個新的矩陣S,它的索引是1或3.A包含say,1-> 2,3-> 6的信息。在這種情況下,我不能使用你的建議代碼,因爲在你的代碼中,n不僅代表A的列號,而且代表S的實際值。因此,你的任何建議都無法工作,因爲我們'會遇到超過錯誤的指數。 – luvegood

+0

哦,我明白了。請嘗試我的修改答案。看看它是否更快。 –