我正在尝试创建一个函数,它可以将矩阵中的特定数字与同一矩阵中的另一个特定数字交换。例如,如果我从A = [1 2 3; 1 3 2]开始,我想能够通过告诉Matlab将1和2交换来创建B = [2 1 3; 2 3 1]。任何建议都将不胜感激。谢谢!
另一种解决原问题的方法是创建一个置换向量,指示应将原始条目映射到哪些数字。对于这个例子,条目 [1 2 3] 应分别映射到 [2 1 3],这样我们就可以写成
A = [1 2 3; 1 3 2];
perm = [2 1 3];
B = perm(A)
优点在于所有操作都可以在一步内完成,而且它也适用于比交换更复杂的操作;缺点是 A 的所有元素必须是已知最大正整数。
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;
不确定为什么要进行这种特定的交换(行/列交换更为常见)。Matlab通常使用“:”来表示某个东西的全部。以下是如何交换行和列:
交换行:
A = A([New order of rows,,...], :)
A = A(:, [New order of columns,,...])
要更改整个第i列:
A(:, i) = [New; values; for; i-th; column]
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
>> A = 1:1:3
A = [1,2,3]
>> B = A * 2
B = [2,4,6]
可能有一个swapif原语可以使用,但我很久没有使用Matlab了,所以我不确定最好的方法是什么。
>> 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。
更新
要交换两个不同值的元素,请查找函数
ind = find(a==1);
返回所有值为1的元素的索引。然后,您可以使用Mitch's建议使用索引数组更改元素的值。请记住,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