Очевидная ошибка в функции perms Matlab

 p = perms([0:2])

p =

 2     1     0
 2     0     1
 1     2     0
 1     0     2
 0     1     2
 0     2     1

эта функция должен отображать перестановки вектора в обратном лексикографическом порядке. Следовательно, я ожидал бы, что последняя строка этого вывода будет содержать элементы 0 1 2, однако, он содержит 0 2 1. Остальные строки отображаются правильно.

короче говоря, порядок последних двух строк взаимозаменяемы. Что здесь происходит?

1 ответов


да, кажется, это ошибка. Хороший улов! Но, вероятно, ошибка в документация, а не в функции.

если ты типа open perms посмотреть исходный код, вы увидите следующее описание в первых строках:

%PERMS  All possible permutations.
%   PERMS(1:N), or PERMS(V) where V is a vector of length N, creates a
%   matrix with N! rows and N columns containing all possible
%   permutations of the N elements.
%
%   This function is only practical for situations where N is less
%   than about 10 (for N=11, the output takes over 3 gigabytes).
%
%   Class support for input V:
%      float: double, single
%      integer: uint8, int8, uint16, int16, uint32, int32, uint64, int64
%      logical, char

в котором нет ссылки на обратный лексикографический порядок.

фактическая работа выполняется рекурсивной локальной функцией permsr. Если вы посмотрите на его код, сначала не очевидно, как он работает (как обычный с рекурсией), но строка

t(t == i) = n

дает подсказку, что в результате не ищется никакого конкретного порядка.

если вы попробуете больший вектор вы увидите расхождения с обратным лексикографическим порядком в несколько строк:

>> perms(0:3)
ans =
     3     2     1     0
     3     2     0     1
     3     1     2     0
     3     1     0     2
     3     0     1     2
     3     0     2     1   %// here. Affects cols 1 and 2
     2     3     1     0
     2     3     0     1
     2     1     3     0
     2     1     0     3
     2     0     1     3
     2     0     3     1   %// here. Affects cols 1 and 2
     1     2     3     0
     1     2     0     3
     1     3     2     0   %// here. Affects cols 2 and 3
     ...

таким образом, функция, по-видимому, была разработана без учета какого-либо порядка. Это документация, которая, вероятно, ошибочна в утверждении этого порядка.