3
$\begingroup$

Consider an Matrix of dimension n1xn1. I would like to get a list with n2 distinct matrix (of dimension n1xn1), because it involves random numbers. The elements of matrix are numbers 0 or 1. The rules are:

1- The elements of main diagonal of matrix is all 0;

2- The elemnts of first line are 1 with probability z/j and 0 with probability 1 - z/j, where z is a random integer between [1,j-1];

3- The elements of first column are 1 with probability k/i and 0 with probability 1 - k/i, where k is a random integer between [1,i-1];

4- The elements of matrix for i>1, j>1 and i≠j are z/j with prabability 1 and 1-z/j with probability 0, where z is a random integer between [1,j-1].

n1 = 5; (*dimension of matrix*)
n2 = 10; (*number of matrix*)
z[j_] := RandomInteger[{1, j - 1}];(*generate random number integer to first line*)
k[i_] := RandomInteger[{1, i - 1}];(*generate random number integer to first column*)
l[i_, j_] := 
  If[j == 1 && i > 1, RandomChoice[{k[i]/i, 1 - k[i]/i} -> {1, 0}], 
   If[i == 1 && j > 1, RandomChoice[{z[j]/j, 1 - z[j]/j} -> {1, 0}], 
    RandomChoice[{k[i]/i, 1 - k[i]/i} -> {1, 0}]]];

Generating a matrix using SparseArray

s =  SparseArray[{{i_, i_} -> 0, {i_, j_} -> l[i, j]}, {n1, n1}]

For generate a list with n2 matrix (n1 x n1) I used table:

t= Table[s, {k,10}]

However, the output returns n2 identical matrices. I need different matrices.

So, I decided to use the following command:

s = Table[
  SparseArray[{{i_, i_} -> 0, {i_, j_} -> l[i, j]}, {n1, n1}], {n, n2}]

That returns the mistake/error

RandomChoice::weightv: The weights given on the left-hand side of {0,0}->{1,0} should be a list of positive numerical quantities having the same length as the list given on the right-hand side. >>

RandomChoice::weightv: The weights given on the left-hand side of {0,0}->{1,0} should be a list of positive numerical quantities having the same length as the list given on the right-hand side. >>

Can anybody help me?

$\endgroup$
  • $\begingroup$ @happyfish I don't see where this happens. $\endgroup$ – SAC Apr 2 '17 at 14:56
  • $\begingroup$ for example, {k[1], 1-k[1]} can evaluate to {0, 0}. $\endgroup$ – happy fish Apr 2 '17 at 15:07
10
$\begingroup$

You get this error because sometimes the input for RandomChoice is {0, 0}. But at the first glance, you wrote code similar to {k[i], 1-k[i]}, which has no obvious mistake. However, you should think carefully how your k is defined. With SetDelayed, the random number generated by k changes each time it is evaluated. So you can get {0, 0} at a probability of $\frac{1}{4}$. You can change your code like this:

l[i_, j_] := 
  If[j == 1 && i > 1, 
   With[{p = k[i]}, RandomChoice[{p/i, 1 - p/i} -> {1, 0}]], 
   If[i == 1 && j > 1, 
    With[{p = z[j]}, RandomChoice[{p/j, 1 - p/j} -> {1, 0}]], 
    With[{p = k[i]}, RandomChoice[{p/i, 1 - p/i} -> {1, 0}]]]];
$\endgroup$
  • $\begingroup$ I understood. Thank you so much. It worked! $\endgroup$ – SAC Apr 2 '17 at 16:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.