diff scripts/sparse/sprand.m @ 5164:57077d0ddc8e

[project @ 2005-02-25 19:55:24 by jwe]
author jwe
date Fri, 25 Feb 2005 19:55:28 +0000
parents
children 9761b7d24e9e
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scripts/sparse/sprand.m
@@ -0,0 +1,58 @@
+## Copyright (C) 2004 Paul Kienzle
+##
+## This program is free software and is in the public domain
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} sprand (@var{m}, @var{n}, @var{d})
+## @deftypefnx {Function File} {} sprand (@var{s})
+## Generate a random sparse matrix. The size of the matrix will be
+## @var{m} by @var{n}, with a density of values given by @var{d}.
+## @var{d} should be between 0 and 1. Values will be normally
+## distributed with mean of zero and variance 1.
+##
+## Note: sometimes the actual density  may be a bit smaller than @var{d}. 
+## This is unlikely to happen for large really sparse matrices.
+##
+## If called with a single matrix argument, a random sparse matrix is
+## generated wherever the matrix @var{S} is non-zero.
+## @end deftypefn
+## @seealso{sprandn}
+
+
+## This program is public domain
+## Author: Paul Kienzle <pkienzle@users.sf.net>
+##
+## Changelog:
+##
+## Piotr Krzyzanowski <przykry2004@users.sf.net>
+## 	2004-09-27	use Paul's hint to allow larger random matrices
+##			at the price of sometimes lower density than desired
+## David Bateman 
+##      2004-10-20      Texinfo help and copyright message 
+
+function S = sprand (m, n, d)
+  if nargin == 1
+    [i,j,v,nr,nc] = spfind(m);
+    S = sparse (i,j,rand(size(v)),nr,nc);
+  elseif nargin == 3
+    mn = n*m;
+    k = round(d*mn); # how many entries in S would be satisfactory?
+    idx=unique(fix(rand(min(k*1.01,k+10),1)*mn))+1; 
+                # idx contains random numbers in [1,mn]
+  		# generate 1% or 10 more random values than necessary
+		# in order to reduce the probability that there are less than k
+		# distinct values;
+    		# maybe a better strategy could be used
+     		# but I don't think it's worth the price
+    k = min(length(idx),k);  # actual number of entries in S
+    j = floor((idx(1:k)-1)/m);
+    i = idx(1:k) - j*m;
+    if isempty(i)
+      S = sparse(m,n);
+    else
+      S = sparse(i,j+1,rand(k,1),m,n);
+    endif
+  else
+    usage("sprand(m,n,density) OR sprand(S)");
+  endif
+endfunction