如何在matlab中轻松计算数组的循环置换[1 2 3 4]。是否有任何函数可以直接计算matlab中的循环置换。
答案 0 :(得分:3)
我假设循环置换你的意思是this( 1 2 3 4
被认为是与其循环移位2 3 4 1
相同的排列;你想要所有不同的排列彼此的任何循环移位):
一种可能的方法是生成所有排列,识别循环相等的排列,并且每组只保留一个排列。这可以通过仅保留以给定索引开始的那些排列来完成,例如1.由此可以通过生成元素2,3的所有排列以及将元素1附加在前面来解决问题:
x = [ 1 2 3 4 ]; %// data
p = perms(x(2:end)); %// generate all permutations of x(2), x(3), ...
p = [ repmat(x(1),size(p,1),1) p ]; %// attach x(1) in front of each permutation
在此示例中,结果为:
p =
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
或者,如果您的意思是this(您希望生成彼此循环移位的所有排列:1 2 3 4
,2 3 4 1
等等; {{1}不允许):
1 3 2 4
结果:
x = [ 1 2 3 4 ]; %// data
n = numel(x);
ii = mod(bsxfun(@plus, 1:n, (0:n-1).')-1, n) + 1;
p = x(ii);
答案 1 :(得分:1)
circshift
能做你需要的吗?
答案 2 :(得分:1)
您可以使用 circshift 将数组元素移动到圆圈中。然后总是选择相同的数组值:
A=(1:5)';
P = A(1);
P =
1
Y = circshift(A,1);
P = A(1);
P =
5;
答案 3 :(得分:0)
使用toeplitz
矩阵:
%// Some random data
A = randi(100,[1 n]);
%// all circular shifts to the right
A(toeplitz(1:numel(A), [1 numel(A):-1:2]))
%// all circular shifts to the left
A(rot90(toeplitz(1:numel(A), [1 numel(A):-1:2])))
可能不是最快的,但很高兴知道:)