Matlab 将指定的向量元素附加到向量的所有置换中,';大部分是随机的';邻近整数等的行排序
在Matlab中 1) 如果我有一个向量,比如说[1,2,3],那么我要创建一个矩阵,它包含向量的每一个置换,另外一列附加,每个置换包含原始向量的第一个元素。然后,我希望将这个矩阵(按行)附加到另一个矩阵,其中附加的列是第二个元素。接下来的第三个也是一样的。i、 e:Matlab 将指定的向量元素附加到向量的所有置换中,';大部分是随机的';邻近整数等的行排序,matlab,matrix,random,vector,permutation,Matlab,Matrix,Random,Vector,Permutation,在Matlab中 1) 如果我有一个向量,比如说[1,2,3],那么我要创建一个矩阵,它包含向量的每一个置换,另外一列附加,每个置换包含原始向量的第一个元素。然后,我希望将这个矩阵(按行)附加到另一个矩阵,其中附加的列是第二个元素。接下来的第三个也是一样的。i、 e: 3 2 1 1 3 1 2 1 2 3 1 1 2 1 3 1 1 2 3 1 1 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,但后面不会跟80)?(为了让事情变得更加复杂,有没有一种方法可以指定这种情况大部分时间都会发生,但不是所有时间都会发生?)
3) 创建列向量的简洁方法是什么
0
0
0
0
1
1
1
1
2
2
2
2
3
3
3
3
等,直到指定的长度(或者,如果没有,直到指定的数字)?对于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
,可用
3) :
正如在评论中告诉您的,您的问题2定义不够。它本身可能值得提出一个问题,对约束条件进行更详细的解释
也就是说,1)和2)的另一种选择是:
有很多方法可以做到这一点 问题1: 千里迢迢
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)] ;
问题3: 与上述方法相同。重塑为列向量的矩阵乘法:
n = 3 %// your specified number
v = 0:n ;
Vlong = reshape(ones(numel(v),1)*v,[],1) ;
你能明确表示2吗?对于2):这还不足以解决这个问题,但是拒绝抽样可能是一个解决方案。你已经有了关于第一季度和第三季度的两个答案(你可能会得到更多答案)。我建议你将Q2从这篇文章中删除,并单独发布,给出更明确的排序规则细节。它太模糊了,因为它是…谢谢你@hoki-我几乎肯定会尝试在一分钟内。目前我刚刚更新了输入,所以我想知道这是否有帮助?我希望按照第一列中的数字对行进行排序,我希望它们是随机的,但它们总是彼此接近(例如…63后面可能跟68或59,但不是说85…?)
n = 3 %// your specified number
v = 0:n ;
Vlong = reshape(ones(numel(v),1)*v,[],1) ;