将指定的向量元素附加到向量的所有排列,大多数是随机的'附近整数的行排序等

时间:2015-07-07 20:52:06

标签: matlab matrix random vector permutation

在Matlab中

1)如果我有一个向量,说[1 2 3]那么我想要创建一个包含向量的每个排列的矩阵,附加的另一列包含每个排列的第一个元素原始矢量。然后,我希望将此矩阵(按行)附加到另一个附加列是第二个元素的位置。然后与第三个相同的事情。即:

 3     2     1     1
 3     1     2     1
 2     3     1     1
 2     1     3     1
 1     2     3     1
 1     3     2     1
 3     2     1     2
 3     1     2     2
 2     3     1     2
 2     1     3     2
 1     2     3     2
 1     3     2     2
 3     2     1     3
 3     1     2     3
 2     3     1     3
 2     1     3     3
 1     2     3     3
 1     3     2     3

这是一种很长的写作方式,但我确定这里的某人能够以非常简洁的方式编写它:

a = [1 2 3]; b = perms(a); 
c = [a(1); a(1); a(1); a(1); a(1); a(1)] ;
d = [a(2); a(2); a(2); a(2); a(2); a(2)] ;
e = [a(3); a(3); a(3); a(3); a(3); a(3)] ;
f = [ c; d; e ]
g = [ b; b ; b]
h = [g f]

2)有没有办法做一个大多数随机的'订购哪里,比如你有一个如下列表:

64    69    72    72
64    72    69    75
76    67    72    70
62    69    65    72
71    74    65    77
74    69    65    72
67    71    74    74
67    76    72    79
76    79    71    82
60    64    69    67
64    67    72    70
67    64    60    67
72    65    69    68
74    71    65    74
65    69    62    72
71    74    67    77
71    62    65    65
67    72    64    75
77    74    71    77
76    72    67    75
77    69    74    72
74    67    71    70
79    71    74    74
76    71    79    74
69    62    65    65
65    62    71    65
69    65    74    68
69    64    60    67
71    79    74    82
71    74    77    77
69    74    77    77
72    69    77    72
77    72    69    75
74    65    71    68
71    62    67    65
71    77    74    80
74    77    71    80
77    71    74    74
69    65    72    68
65    71    74    74
67    71    76    74
64    67    60    70
65    72    69    75
71    74    79    77
72    76    69    79
67    62    71    65
72    69    65    72
69    72    76    75
79    74    71    77
72    67    64    70
71    67    76    70
67    72    76    75
71    65    74    68
65    69    60    72
69    72    77    75
64    69    60    72
76    69    72    72
69    76    72    79
64    72    67    75
72    77    69    80
67    76    71    79
69    60    65    63
67    60    64    63
71    64    67    67
69    60    64    63
71    67    62    70
60    64    67    67
74    69    77    72
65    74    71    77
62    71    65    74
67    71    64    74
65    74    69    77
76    67    71    70
62    67    71    70
74    71    79    74
77    74    69    77
67    64    71    67
62    65    71    68
65    60    69    63
62    65    69    68
60    69    65    72
71    65    62    68
65    69    74    72
67    74    71    77
71    79    76    82
69    74    65    77
69    77    72    80
67    71    62    74
72    64    67    67
74    77    69    80
76    72    69    75
69    72    65    75
71    76    79    79
64    60    67    63
64    60    69    63
74    65    69    68
79    76    71    79
64    67    71    70
72    67    76    70
72    76    67    79
69    65    60    68
60    67    64    70
69    64    72    67
69    65    62    68
65    62    69    65
74    71    67    74
65    69    72    72
72    69    64    72
60    69    64    72
76    71    67    74
64    71    67    74
60    65    69    68
74    79    71    82
65    71    62    74
67    64    72    67
71    67    74    70
79    71    76    74
62    71    67    74
74    71    77    74
71    67    64    70
72    64    69    67
71    76    67    79
69    77    74    80
77    69    72    72
69    72    64    75
72    69    76    72

您可以对此进行排序,以便行顺序是随机的,但第一列中的所有数字通过定义的参数大多彼此接近(例如,62可能后跟67或58但不会#39;然后说80)? (为了使事情变得更加复杂,可能有一种方法可以指明这种情况发生的时间最多但并不是所有的时间?)

3)创建列向量的简洁方法是什么

0
0
0
0
1
1
1
1
2
2
2
2
3
3
3
3

等,直到达到指定的长度(或者,如果失败,直到达到指定的数量)?

2 个答案:

答案 0 :(得分:0)

For 1)您可以使用以下代码:

%sprows is just a utility function, which splits a matrix into a cell
sprows=@(x)(mat2cell(x,ones(size(x,1),1)))
%get all combinations of perms(a) and a
cell2mat(allcomb(sprows(perms(a)),sprows(a(:))))

它使用来自matlab文件交换的allcomb,可用here

3):

x=repmat(0:3,4,1);
x=x(:);

答案 1 :(得分:0)

正如评论中所说,你的问题2没有足够的定义。它本身可能值得一个问题,约束更加详细和解释。

那就是1)和2)的另一种选择:
有很多方法可以做到这一点

Q1:

很长的路

a = [1 2 3] ; %// starting set

n = numel(a) ;
lastCol = ones(factorial(n),1) * a ;
ap = [repmat(perms(a),n,1) lastCol(:)] ;

或直接没有中间变量:

ap = [repmat(perms(a),numel(a),1) reshape(ones(factorial(numel(a)),1)*a,[],1)] ;

Q3:

与上面使用的方法相同。矩阵乘法重新整形为柱状矢量:

n = 3       %// your specified number

v = 0:n ;
Vlong = reshape(ones(numel(v),1)*v,[],1) ;