3

假设现在我有一个矩阵

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 循环有点慢。有没有更快的方法来做到这一点?

4

3 回答 3

3

使用 的第二个输出为ismember您提供 A 的第 1 行中的值的索引。使用这些索引直接创建 matrix 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
于 2012-09-15T23:25:41.977 回答
1

您可以使用单线来解决此问题arrayfun,如下所示:

SS = arrayfun(@(x)A(2, (A(1, :) == x),  S)
于 2012-09-15T21:11:27.317 回答
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)
于 2012-09-15T18:54:48.520 回答