我正在尝试创建一个函数,它将矩阵中的特定数字与同一矩阵中的特定数字交换。对于考试,如果我从A = [1 2 3; 1 3 2]开始,我希望能够创建B = [2 1 3; 2 3 1],只需告诉matlab将1与2交换。任何意见,将不胜感激。谢谢!
答案 0 :(得分:3)
如果您有以下矩阵:
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 :(得分:3)
处理原始问题的另一种方法是创建置换向量,指示原始条目应映射到哪些数字。对于该示例,条目[1 2 3]应分别映射到[2 1 3],以便我们可以写
A = [1 2 3; 1 3 2];
perm = [2 1 3];
B = perm(A)
(这里的优点是一切都在一步完成,并且它也适用于比交换更复杂的操作;缺点是A的所有元素必须是具有已知最大值的正整数)
答案 2 :(得分:2)
不确定为什么要执行该特定交换(行/列交换更常见)。 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])
答案 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
我喜欢这个解决方案,它让所有内容更清晰。较少的魔术数字可以很容易地变成一个函数。如果重要,则重新使用相同的矩阵。
答案 4 :(得分:1)
我没有安装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,所以我不确定最好的方法。
答案 5 :(得分:1)
参考tarn's更优雅的交换值方式,您可以使用置换矩阵,如下所示:
>> a =[1 2 3];
>> T = [1 0 0;
0 0 1;
0 1 0];
>> b = a*T
ans =
1 3 2
但这将交换向量的第2列和第3列(矩阵) a ;而问题是关于交换1和2的问题。
<强>更新强>
要交换两个不同值的元素,请查看find函数
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