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