ordered/circular 烫发的八度函数

octave function for ordered/circular perms

所以在八度音程中我可以做到这一点

octave:3> perms([1 2 3])
ans =

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

但是如果我想要类似perms但保持输入向量的顺序(例如[1 2 3]),如下

1 2 3
3 1 2
2 3 1

有内置函数吗?

是的,使用 circshift

x=[1 2 3];
res=zeros(length(x),length(x));
for ii=1:length(x)
   res(ii,:)=circshift (x', ii-1)
end

函数 circshift 一次只能处理一个班次,迫使您对其进行循环。矢量化的替代方案是:

octave> x = [4 5 6];
octave> n = numel (x);
octave> idx = mod ((0:(n-1)) .+ ((0:(n-1))'), n) +1;
octave> x(idx)
ans =

   4   5   6
   5   6   4
   6   4   5