【发布时间】:2013-12-16 16:36:21
【问题描述】:
首先让我说我是 MATLAB 的绝对初学者。我被分配了一个任务,通过交换相邻的数字来生成一个包含数字“n”数字的所有排列的矩阵“A”。
我已经被这个问题困扰了两天,这和我来的时候一样接近答案:
X=[1:n]
A(1,:)=X;
for j=0:n
for i=n:-1:2
if X(i)==(n-j)
temp=X(i);
X(i)=X(i-1);
X(i-1)=temp;
A=[A; X];
end
end
end
A
这适用于 n=3。我想知道是否可以采取任何措施来修复此代码,或者我是否应该尝试一些完全不同的方法。
编辑
这是第二次尝试,有一些方向的概念。问题是这个脚本只遵循一个“轨道”。 det(I(:,X)) 告诉我先前的排列是奇数还是偶数,以及整数应该向右还是向左交换。我想让它两者兼得!
n=input('n: ')
X=[1];
for i=2:n
u=length(X);
I = speye(u);
if det(I(:,X))>0
X=[X i];
X
X([i-1 i])=X([i i-1]);
X
else
X=[i X];
X
for j=1:i-1
X([j j+1])=X([j+1 j]);
X
end
end
end
【问题讨论】:
-
如果您想使用特定的算法,请准确地写出来,如果需要我们可以帮助实现它。
-
“交换相邻的数字”是什么意思?能举个小例子吗?
-
我应该使用 Steinhaus-Johnson-Trotter 算法,我理解它使用交换。
-
如果您在Steinhaus–Johnson–Trotter algorithm 上查找信息,您可能会遇到一些运气 - 本教程对它的工作原理进行了很好且清晰的解释。
-
在尝试将您的代码与算法进行比较时,我遇到的第一个大问题是您似乎没有跟踪每个数字的方向。
标签: matlab list permutation linear-algebra swap