Очевидную ошибку в функций Матлаб по химической завивки
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 ...