|
|
Re: generation of random multiset permutation with restrictions
Posted:
Aug 21, 2012 7:32 AM
|
|
"Bruno Luong" <b.luong@fogale.findmycountry> wrote in message <k0vppj$9u1$1@newscl01ah.mathworks.com>... > "Michal Kvasnicka" wrote in message <k0vp6r$83h$1@newscl01ah.mathworks.com>... > > "Bruno Luong" <b.luong@fogale.findmycountry> wrote in message <k0visb$hog$1@newscl01ah.mathworks.com>... > > > This should work for standard array p: > > > > > > OK = @(p) isequal(sort(a),sort(p)) && all(arrayfun(@(x,s) ismember(x,s{1}),p,s)); > > > > > > % Bruno > > > > Your solution is very elegant and effective. Thanks again! > > > > Is there any reason to completely eliminate cells (e.g. s = {[3],[1,2],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[2,3],[2,3]};) from the numerical intensive computation and work only with standard arrays? OK function (and previous method for generation of random multiset permutation with restrictions) will be called very often (about 10^3-10^6 times), so I am looking for fastest method as possible. > > If your set is not too large you might use logical array to store a set, e.g. > {3} is coded as [0 0 1]'; > {1 2} is coded as [1 1 0]'; > > And s as > [0 0 1; 1 1 0; 1 1 1; 1 1 1; 1 1 1; 0 1 1; 0 1 1]' ; > > Bruno OK ... this looks very interesting.
How do I change the following lines of code to work with logical restriction array s = [0 0 1; 1 1 0; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 0 1 1; 0 1 1]' ?
D = cellfun(@(x) min(abs(bsxfun(@minus,x(:),p)),[],1), s, 'unif', 0); D = cat(1,D{:});
and
OK = @(p) isequal(sort(a),sort(p)) && all(arrayfun(@(x,s) ismember(x,s{1}),p,s));
And how to convert these two restrictions representations between each other?
|
|