3

2 つのマトリックスがあります。最初のものは私の入力行列です

ここに画像の説明を入力

2番目のもの(「名前変更マトリックス」)は、最初のものの値を置き換えるために使用されます

ここに画像の説明を入力

つまり、名前変更マトリックスを調べます。701 は 1 に置き換える必要があります,...,717 は 10 に置き換える必要があります.. 入力行列がそのようになるように

ここに画像の説明を入力

? 値は定義されていますが、入れていません。入力行列の 2 列目は既に並べ替えられています (上から下への昇順) が、値は連続していません (「710」なし: 最初の写真を参照)。

問題は、最初の 2 つから出力行列 (最後の写真) を取得する方法です。

4

3 に答える 3

2

スパース行列ソリューションを求めて叫んでいるように私には見えます。matlabでは、次のコマンドを使用してスパース行列を作成できます。

SM = sparse( ri, ci, val );

ここで、riはゼロ以外の要素の行インデックス、ciは対応する列インデックス、valは値です。

入力行列IMとルックアップ行列を呼び出してLUM、スパース行列を作成します。

nr = size(LUM, 1);
SM = sparse( ones(nr, 1), LUM(:, 1), LUM(:, 2) );

これで、結果を1行で取得できます。

newMatrix = reshape(SM(1, IM), size(IM));

ほとんど魔法。

今夜これをチェックする機会はありませんでしたが、説明どおりに機能しない場合は、本当に近いはずです...

于 2013-02-14T03:14:46.590 に答える
1

Mが元の行列で、が名前変更行列の場合R、次のようにします。

N = M;

for n = 1:size(M,1)
    N(find(M==R(n,1))) = R(n,2);
end

この場合N、名前を変更した値で新しいマトリックスを作成していることに注意してください。あなたが好きなら、あなたはそれをする必要はありません。

于 2013-02-13T22:31:31.057 に答える
1

最初の列の値がすべて 2 番目の列に表示され、2 番目の列の値を で置き換え、1..nそれに応じて最初の列の値を変更するだけの場合は、次の単純な呼び出しでこれらすべてを行うことができますismember

%# define "inputMatrix" here as the first array in your post

[~,newFirstColumn] = ismember(inputMatrix(:,1),inputMatrix(:,2));

出力を作成するには、次のように記述します

outputMatrix = [newFirstColumn,(1:length(newFirstColumn))'];
于 2013-02-13T22:30:10.220 に答える