如何计算数组的循环置换?

时间:2014-03-24 16:51:09

标签: matlab math

如何在matlab中轻松计算数组的循环置换[1 2 3 4]。是否有任何函数可以直接计算matlab中的循环置换。

4 个答案:

答案 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 42 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])))

可能不是最快的,但很高兴知道:)