簡體   English   中英

Matlab交換

[英]Matlab swap

我正在嘗試創建一個函數,它將矩陣中的特定數字與同一矩陣中的特定數字交換。 對於考試,如果我從A = [1 2 3; 1 3 2]開始,我希望能夠創建B = [2 1 3; 2 3 1],只需告訴matlab將1與2交換。 任何意見,將不勝感激。 謝謝!

如果您有以下矩陣:

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

並且你希望所有的人成為兩個人並且成為一個人,以下將是最簡單的方法:

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

編輯:

正如Kenny所說,這甚至可以進一步簡化為:

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

處理原始問題的另一種方法是創建一個置換向量,指示原始條目應映射到哪些數字。 例如,條目[1 2 3]應分別映射到[2 1 3],以便我們可以編寫

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

(這里的優點是一切都在一步完成,並且它也適用於比交換更復雜的操作;缺點是A的所有元素必須是具有已知最大值的正整數)

不確定為什么要執行特定的交換(行/列交換更常見)。 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

我喜歡這個解決方案,它使得更清楚的是發生了什么。 較少的魔術數字可以很容易地變成一個函數。 如果重要,則重新循環使用相同的矩陣。

我沒有安裝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,所以我不確定最好的方法。

在參考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的問題。

更新

要交換兩個不同值的元素,請查看find函數

ind = find(a == 1);

返回帶有值的所有元素的索引1.然后,您可以使用Mitch的建議來使用索引數組更改元素的值。 記得find將線性索引返回到矩陣中; 第一個元素具有索引1,而nxm矩陣的最后一個元素具有線性索引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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM