Is there a better way to randomly generate a Doubly Stochastic Matrix?
Mostra commenti meno recenti
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 Commento
Matt Fig
il 17 Nov 2012
Can you post what GRPdur does? Is it akin to RANDPERM?
Risposta accettata
Più risposte (1)
Derek O'Connor
il 23 Nov 2012
Categorie
Scopri di più su MATLAB in Centro assistenza e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!