4

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

4

6 回答 6

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;
于 2009-03-15T17:55:19.683 回答
3

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

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

(这里的优点是一切都在一个步骤中完成,并且它也适用于比 swaps 更复杂的操作;缺点是 A 的所有元素必须是具有已知最大值的正整数)

于 2009-03-22T14:16:15.830 回答
2
A = [1 2 3; 1 3 2]

alpha = 1;
beta = 2;

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

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

我喜欢这个解决方案,它使发生的事情更清楚。更少的幻数,可以很容易地变成一个函数。如果这很重要,则回收相同的矩阵。

于 2009-03-16T13:59:25.187 回答
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]) 
于 2009-03-15T02:24:03.260 回答
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,所以我不确定最好的方法。

于 2009-03-15T02:13:22.273 回答
1

参考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 = 查找(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 
于 2009-03-15T04:01:05.680 回答