用matlab中的其他值替换矩阵中的索引

时间:2012-09-15 18:10:36

标签: matlab matrix matrix-indexing

假设我现在有一个矩阵

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”将被替换为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循环有点慢。有没有更快的方法呢?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果我正确理解了你的问题,我会使用numpy数组而不是标准的python数组或列表。然后代码变得非常简单,如下所示:

# 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,它将如下所示:

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)

答案 2 :(得分:1)

你可以使用arrayfun单行代码进行此操作,如下所示:

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