Очевидную ошибку в функций Матлаб по химической завивки


 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 7

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
     ...
Таким образом, функция, по-видимому, была разработана без учета какого-либо порядка. Это документация, которая, вероятно, ошибочна в утверждении этого порядка.