【问题标题】:Finding all permutations by swapping (MATLAB)通过交换查找所有排列(MATLAB)
【发布时间】: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


【解决方案1】:

基本上,您应该利用 matlab 提供的功能,并让它为您完成工作。

这就是所有需要的:

P = perms(v)

【讨论】:

  • 如果我没有被要求通过交换相邻数字来找到一种方法,我会这样做
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多