Matlab交换变量

4
我正在尝试创建一个函数,它可以将矩阵中的特定数字与同一矩阵中的另一个特定数字交换。例如,如果我从A = [1 2 3; 1 3 2]开始,我想能够通过告诉Matlab将1和2交换来创建B = [2 1 3; 2 3 1]。任何建议都将不胜感激。谢谢!

也许Matlab是这篇帖子更好的标签。 - tarn
6个回答

3

另一种解决原问题的方法是创建一个置换向量,指示应将原始条目映射到哪些数字。对于这个例子,条目 [1 2 3] 应分别映射到 [2 1 3],这样我们就可以写成

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

优点在于所有操作都可以在一步内完成,而且它也适用于比交换更复杂的操作;缺点是 A 的所有元素必须是已知最大正整数。


3
如果您有以下矩阵:
A = [1 2 3; 1 3 2];

如果你想让所有的 "1" 变成 "2",所有的 "2" 变成 "1",那么以下是最简单的方法:
B = A;
B(find(A == 1)) = 2;
B(find(A == 2)) = 1;

编辑:

正如Kenny所建议的那样,这甚至可以进一步简化为:

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

1
同上。只有在需要获取索引值时才需要使用find()。如果你只是像这样进行过滤任务,跳过它会更清晰和更短。 - Jason S
同意。我更新了答案。实际上,我最初也是像Doug一样先存储索引,这样我就可以直接修改A了,但后来意识到OP无论如何都想创建一个新矩阵。当我简化它时,我忘记删除查找操作了。 - gnovice
澄清一下,当我像Doug在他的例子中那样存储索引时,我已经养成了使用FIND的习惯。最近,我一直在处理非常大的矩阵,其中逻辑索引非常稀疏。在这种情况下,存储线性索引比完整的逻辑数组占用更少的内存。 - gnovice

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]的第二列和第三列:
A = A(:, [1, 3, 2]) 

+1 是因为这看起来是一件非常奇怪的事情... 或许有完全避免它的方法。 - David Z

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

alpha = 1;
beta = 2;

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

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

我喜欢这个解决方案,它让事情更清晰。少了不必要的数字,可以很容易地转换为函数。如果需要,可以重复使用同一个矩阵。


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了,所以我不确定最好的方法是什么。


1
关于tarn's使用更优雅的交换值方法,您可以使用排列矩阵如下:
>> 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 

大家好,我刚刚完成了编写代码的工作。我想感谢你们所有人的帮助。 - Tanner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接