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