Matlab交换

Matlab交换,matlab,matrix,swap,Matlab,Matrix,Swap,我试图创建一个函数,将矩阵中的特定数字与同一矩阵中的特定数字交换。例如,如果我从A=[1 2 3;1 3 2]开始,我希望能够创建B=[2 1 3;2 3 1],只需告诉matlab将1与2互换即可。如有任何建议,将不胜感激。谢谢 我没有安装MatLab的副本,但我认为你可以做这样的事情 for i=1:length(A) if (A(i)=1), B(i) = 2, B(i)=A(i) end 注意,这只是将1转换为2,而且看起来您还需要将2转换为1,因此您需要做更多的工作 如果你能

我试图创建一个函数,将矩阵中的特定数字与同一矩阵中的特定数字交换。例如,如果我从A=[1 2 3;1 3 2]开始,我希望能够创建B=[2 1 3;2 3 1],只需告诉matlab将1与2互换即可。如有任何建议,将不胜感激。谢谢

我没有安装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了,所以我不确定最好的方法

不确定为什么要执行特定交换(行/列交换更常见)。Matlab通常表示“:”来表示所有的东西。以下是如何交换行和列:

要交换行,请执行以下操作:

A = A([New order of rows,,...], :) 
要交换列,请执行以下操作:

A = A(:, [New order of columns,,...])
要更改整个第i列,请执行以下操作:

A(:, i) = [New; values; for; i-th; column] 
例如,交换A的第2列和第3列=[1 2 3;1 3 2]

A = A(:, [1, 3, 2]) 
关于更优雅的值交换方式,您可以使用如下排列矩阵:

>> 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的所有元素的索引。然后,您可以使用建议更改使用索引数组的元素的值。记住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 

如果您有以下矩阵:

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是这篇文章的更好标签。+1因为它似乎是一件非常奇怪的事情。。。也许有一种方法可以完全绕过它。大家好,我刚刚写完代码。我要感谢你们所有人的帮助,同上。仅当您希望获取索引值时,才需要find()。如果你只是在做这样的过滤任务,跳过它会更清晰、更短。同意。我更新了答案。实际上,我第一次是按照Doug的方式做的(先存储索引,这样我就可以修改A),但后来意识到OP无论如何都想创建一个新的矩阵。当我简化它时,我忘了删除发现。为了澄清,当我像Doug在他的例子中那样存储索引时,我已经养成了使用FIND的习惯。最近,我一直在处理逻辑索引非常稀疏的非常大的矩阵。在这种情况下,存储线性索引比完整的逻辑阵列占用更少的内存。
A = [1 2 3; 1 3 2];
perm = [2 1 3];
B = perm(A)