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の一意のインデックスであり、2番目の行には最初の行の値が置き換えられる値が含まれています。つまり、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

の2番目の出力を使用して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
于 2012-09-15T23:25:41.977 に答える
1

あなたはこのarrayfunようにワンライナーでこれについて行くことができます:

SS = arrayfun(@(x)A(2, (A(1, :) == x),  S)
于 2012-09-15T21:11:27.317 に答える
1

あなたの質問を正しく理解していれば、標準のPython配列やリストの代わりにnumpy配列を使用します。次に、コードは次のように非常に単純になります。

# 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 に答える