math - Apparent error in Matlab's perms function -
p = perms([0:2])
p =
2 1 0 2 0 1 1 2 0 1 0 2 0 1 2 0 2 1
this function supposed display permutations of vector in reverse lexicographical order. hence, expect last row of output contain elements 0 1 2
; however, contains 0 2 1
. other rows displayed correctly.
in short, order of last 2 rows interchanged. going on here?
yes, seems bug. catch! bug in documentation, rather in function.
if type open perms
see source code, you'll see following description in first lines:
%perms possible permutations. % perms(1:n), or perms(v) v vector of length n, creates % matrix n! rows , n columns containing possible % permutations of n elements. % % function practical situations n less % 10 (for n=11, output takes on 3 gigabytes). % % class support input v: % float: double, single % integer: uint8, int8, uint16, int16, uint32, int32, uint64, int64 % logical, char
in no reference made reverse lexicographical order.
the actual job done recursive, local function permsr
. if @ code, it's not obvious @ first how works (as usual recursion), line
t(t == i) = n
gives clue no particular order sought in result.
if try larger vector you'll see discrepancies reverse lexicographical order in more rows:
>> 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 , 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 , 2 1 2 3 0 1 2 0 3 1 3 2 0 %// here. affects cols 2 , 3 ...
in summary, function seems have been designed without regard order. documentation wrong in claiming order.
Comments
Post a Comment