Is there a better way to randomly generate a Doubly Stochastic Matrix?
Afficher commentaires plus anciens
Here is a profile of the call n = 2*10^3; M = DStochMat02(n,ones(n)./n);
More specifically, can the hot-spot, statement 14, be reduced?
time calls line
1 function M = DStochMat02(n,c)
2 % Generate a random doubly stochastic matrix using
3 % Theorem (Birkhoff [1946], von Neumann [1953])
4 % Any doubly stochastic matrix M can be written as a convex combination
5 % of permutation matrices P1,...,Pk (i.e. M = c1*P1+...+ ck*Pk
6 % for nonnegative c1,...,ck with c1+...+ck = 1).
7 % Complexity: O(n^2)
8 % USE: M = DStochMat02(4,[1/2 1/8 1/8 1/4])
9 % Derek O'Connor, Oct 2006, Nov 2012. derekroconnor@eircom.net
0.02 1 10 M = zeros(n,n);
< 0.01 1 11 I = eye(n);
< 0.01 1 12 for k = 1:n
1.64 2000 13 pidx = GRPdur(n); % Random Permutation
107.72 2000 14 P = I(pidx,:); % Random P matrix
41.09 2000 15 M = M + c(k)*P;
< 0.01 2000 16 end
%--------------------------------------------------------------
function p = GRPdur(n)
% -------------------------------------------------------------
% Generate a random permutation p(1:n) using Durstenfeld's
% O(n) Shuffle Algorithm, CACM, 1964.
% See Knuth, Section 3.4.2, TAOCP, Vol 2, 3rd Ed.
% Complexity: O(n)
% USE: p = GRPdur(10^7);
% Derek O'Connor, 8 Dec 2010. derekroconnor@eircom.net
% -------------------------------------------------------------
p = 1:n; % Start with Identity permutation
for k = n:-1:2
r = 1+floor(rand*k); % random integer between 1 and k
t = p(k);
p(k) = p(r); % Swap(p(r),p(k)).
p(r) = t;
end
return % GRPdur
1 commentaire
Matt Fig
le 17 Nov 2012
Can you post what GRPdur does? Is it akin to RANDPERM?
Réponse acceptée
Plus de réponses (1)
Derek O'Connor
le 23 Nov 2012
Catégories
En savoir plus sur Environment and Settings dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!