Кажущаяся ошибка в функции perms в Matlab

 p = perms([0:2])

р =

 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
     ...

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

Другие вопросы по тегам