行列内の特定の数値を同じ行列内の特定の数値と交換する関数を作成しようとしています。たとえば、A = [1 2 3; 1 3 2]で始める場合、B = [2 1 3; 2 3 1]、matlabに1を2に交換するように指示するだけです。何かアドバイスをいただければ幸いです。ありがとう!
6 に答える
次のマトリックスがある場合:
A = [1 2 3; 1 3 2];
すべての 1 を 2 に、2 を 1 にするには、次の方法が最も簡単な方法です。
B = A;
B(find(A == 1)) = 2;
B(find(A == 2)) = 1;
編集:
ケニーが示唆したように、これは次のようにさらに単純化することもできます。
B = A;
B(A == 1) = 2;
B(A == 2) = 1;
その特定のスワップを実行する理由がわかりません (行/列の交換がより一般的です)。Matlab は、何かのすべてを表すために「:」を表すことがよくあります。行と列を入れ替える方法は次のとおりです。
行を入れ替えるには:
A = A([New order of rows,,...], :)
列を交換するには:
A = A(:, [New order of columns,,...])
i 番目の列全体を変更するには:
A(:, i) = [New; values; for; i-th; column]
たとえば、A = [1 2 3;1 3 2] の 2 列目と 3 列目を交換するには
A = A(:, [1, 3, 2])
A = [1 2 3; 1 3 2]
alpha = 1;
beta = 2;
indAlpha = (A == alpha);
indBeta = (A == beta);
A(indAlpha) = beta;
A(indBeta ) = alpha
私はこの解決策が好きです。何が起こっているのかをより明確にします。マジックナンバーが少なく、簡単に関数にすることができます。重要な場合は、同じマトリックスをリサイクルします。
値を交換するtarn のより洗練された方法を参照すると、次のように順列行列を使用できます。
>> a =[1 2 3];
>> T = [1 0 0;
0 0 1;
0 1 0];
>> b = a*T
ans =
1 3 2
ただし、これはベクトル (行列) aの列 2 と列 3 を交換します。一方、質問は1と2の交換について尋ねました。
アップデート
2 つの異なる値の要素を交換するには、find 関数を調べます
ind = 検索 (a==1);
値が 1 のすべての要素のインデックスを返します。その後、Mitch の提案を使用して、インデックス配列を使用して要素の値を変更できます。find は線形インデックスを行列に返すことを思い出してください。nxm行列の最初の要素のインデックスは 1 で、最後の要素の線形インデックスはn*mです。線形インデックスは列をカウントダウンします。例えば
>> b = [1 3 5;2 4 6];
>> b(3) % same as b(1,2)
ans = 3
>> b(5) % same as b(1,3)
ans = 5
>> b(6) % same as b(2,3)
ans = 6
私は MatLab のコピーをインストールしていませんが、次のようなことができると思います。
for i=1:length(A)
if (A(i)=1), B(i) = 2, B(i)=A(i)
end
これは 1 を 2 に変換するだけであり、2 を 1 に変換する必要があるように見えるので、もう少し作業が必要になることに注意してください。
Matlabでこの種のことができることを考えると、おそらくもっとエレガントな方法もあります
>> A = 1:1:3
A = [1,2,3]
>> B = A * 2
B = [2,4,6]
使用できる swapif プリミティブがあるかもしれませんが、Matlab を長い間使用していないため、最適な方法がわかりません。