MATLAB-swap

Ich versuche, eine Funktion zu erstellen, die eine bestimmte Anzahl in einer Matrix mit einer bestimmten Anzahl in derselben Matrix tauschen wird. Für Examlpe, wenn ich mit a beginne = [1 2 3; 1 3 2], ich will b erstellen können = [2 1 3; 2 3 1], einfach von Matlab, die 1 mit der 2 swap zu sagen. Jede Beratung wird gebeten. Vielen Dank!

Kommentar #1

Nicht sicher, warum Sie würden, dass bestimmte Swap durchführen (Zeile/Spalte Austauschvorgänge sind häufiger). MATLAB häufig kennzeichnet ':' alle etwas darstellen. Hier ist wie Sie Zeilen und Spalten vertauschen:

Um Zeilen zu tauschen:

A = A([New order of rows,,...], :)

Swap-Spalten:

A = A(:, [New order of columns,,...])

Die gesamte i-ten Spalte ändern:

A(:, i) = [New; values; for; i-th; column]

Um beispielsweise die 2. und 3. Spalten von A = tauschen [1 2 3; 1 3 2].

A = A(:, [1, 3, 2])

Kommentar #2

Haben Sie die folgende Matrix:

A = [1 2 3; 1 3 2];

und Sie möchten alle diejenigen zu zweit und den Zweiern, diejenigen zu werden, folgende wäre der einfachste Weg, es zu tun:

B = A;
B(find(A == 1)) = 2;
B(find(A == 2)) = 1;

BEARBEITEN:

Wie Kenny vorgeschlagen, kann dies sogar als weiter vereinfacht werden:

B = A;
B(A == 1) = 2;
B(A == 2) = 1;

Kommentar #3

A = [1 2 3; 1 3 2]

alpha = 1;
beta = 2;

indAlpha = (A == alpha);
indBeta  = (A == beta);

A(indAlpha) = beta;
A(indBeta ) = alpha

Ich mag diese Lösung, macht es klarer was vor sich geht. Weniger magische Zahlen könnte leicht in eine Funktion gemacht werden. Wiederverwendung derselben Matrix, wenn das wichtig ist.

Kommentar #4

Eine andere Möglichkeit, das ursprüngliche Problem anzugehen ist die Schaffung einer Vektor-Variation , die angibt, welche Nummern die ursprünglichen Posten zugeordnet werden soll. Das Beispiel sollte Einträge [1 2 3] bzw. zugeordnet werden [2 1 3], so dass wir schreiben können

A = [1 2 3; 1 3 2];
perm = [2 1 3];
B = perm(A)

(Vorteil dabei ist, dass alles in einem Schritt gemacht und es funktioniert auch für Operationen, die komplizierter als Swaps; Nachteil ist, dass alle Elemente von a positive ganze Zahlen mit maximal bekannt sein müssen)

Kommentar #5

Ich habe keine Kopie von MatLab installiert, aber ich denke, dass Sie tun können, etwas, was wie folgt;

for i=1:length(A)
   if (A(i)=1), B(i) = 2, B(i)=A(i) 
end

Hinweis, das ist nur konvertieren 1 2 und es sieht aus wie möchten Sie auch die 2 in 1, zu konvertieren, so Sie ein wenig mehr Arbeit zu tun müssen.

Es kann wohl auch eine viel elegantere Weise tun es Ihnen tun so etwas in Matlab

>> A = 1:1:3
A = [1,2,3]
>> B = A * 2
B = [2,4,6]

Gibt es möglicherweise ein Swapif primitive können Sie, aber ich habe nicht lange, Matlab verwendet, also bin ich nicht sicher, dass der beste Weg, es zu tun.

Kommentar #6

In Anlehnung an das Département Tarn elegantere Weise Swapping Werte, Sie könnten eine Permutationsmatrix wie folgt verwenden:

>> a =[1 2 3];
>> T = [1 0 0;
        0 0 1;
        0 1 0];
>> b = a*T
ans =
    1 3 2

aber dies wird tauschen, Spalte 2 und Spalte 3 die Vektor (Matrix) ein; während die Frage über tauschen die 1 und 2 des.

Update

Elemente der zwei unterschiedliche Werte Blick in die finden-Funktion austauschen

IND = find(a==1);

Gibt die Indizes aller Elemente mit dem Wert, 1. Mitch die Anregung können Sie dann den Wert der Elemente mithilfe von Index-Arrays ändern. Remeber, die finden gibt den linearen Index in die Matrix zurück; Das erste Element mit der Indexzahl 1 und das letzte Element einer Nxm -Matrix hat linearer Index n * m. Der lineare Index wird über die Spalten gezählt. Zum Beispiel

>> 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

Tags lesen