Re: random matrix from row and column sums
- To: mathgroup at smc.vnet.net
- Subject: [mg53727] Re: random matrix from row and column sums
- From: "Simons, F.H." <F.H.Simons at tue.nl>
- Date: Tue, 25 Jan 2005 05:03:27 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Here is (another) very fast function for finding a matrix of non negative integers with given row and column sums. We start with a random matrix of non negative integers. Then we redefine the first row and the first column in such a way that the matrix has the desired row and column sums, as done by Astanoff in his second posting on this topic. As a consequence, some of the elements on the first row or first column now can be negative. To overcome this, we manipulate the matrix in such a way that the row and column sums do not change and negative entries become at least 0. randommatrix[rowSums_, colSums_] := Module[{mat, neg, a,b}, mat =Table[ Random[Integer,Min[rowSums[[i]],colSums[[j]]]], {i,1, Length[rowSums]},{j,1,Length[colSums]}]; mat[[All, 1]]=rowSums- Total /@ Rest /@ mat; mat[[1]]=colSums-Plus @@ Rest[mat]; neg=Position[mat, _?Negative]; While[Length[neg]>0, {a,b}=neg[[1]];neg=Rest[neg]; Do[If[mat[[a,b]]\[GreaterEqual]0, Return[]]; If[(d = Min[{mat[[a,j]], mat[[i,b]]}])>0, {mat[[a,b]],mat[[a,j]], mat[[i,j]], mat[[i,b]]}={mat[[a,b]],mat[[a,j]], mat[[i,j]], mat[[i,b]]}+{d,-d,d,-d}], {i,1, Length[rowSums]}, {j,1,Length[colSums]}]]; mat] Because of we start with a random matrix, we cannot predict what the resulting matrix will be. But, as Bobby already remarked, it is not at all clear how random the result is. Fred Simons Eindhoven University of Technology