2012-09-15 38 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

哦,我明白了。请尝试我的修改答案。看看它是否更快。 –