Algorithm-RandomMatrixGeneration
view release on metacpan or search on metacpan
lib/Algorithm/RandomMatrixGeneration.pm view on Meta::CPAN
$tmp_cmar[$j] = sprintf($fmt_str, $tmp_cmar[$j] - $ref[$i][$j]);
}
}
else
{
if($rand_num)
{
$ref[$i][$j] = $rand_num;
# adjust the marginals
$tmp_rmar[$i] = $tmp_rmar[$i] - $ref[$i][$j];
$tmp_cmar[$j] = $tmp_cmar[$j] - $ref[$i][$j];
}
}
}
}
return @ref;
}
1;
__END__
=head1 NAME
Algorithm::RandomMatrixGeneration - Generate internal cell values for a matrix given fixed marginal totals.
=head1 SYNOPSIS
use Algorithm::RandomMatrixGeneration;
my @result = generateMatrix(\@row_marginals, \@col_marginals);
=head2 Example: Negative Integer Valued Marginals:
use Algorithm::RandomMatrixGeneration;
my @rmar = ('-5','5','-3');
my @cmar = ('2','3','-2','-6');
my @result = generateMatrix(\@rmargs, \@cmargs, "-");
Output matrix could be:
0 -1 1 3 2 -5 3 -2
0 5
0 -2 2 3 3 -4
=head2 Example: Positive Real Valued Marginals:
use Algorithm::RandomMatrixGeneration;
my @rmargs = (13.01,11,13,13,12,13);
my @cmargs = (23.005,32.005,10,10);
my @result = generateMatrix(\@rmargs, \@cmargs, 3);
Output matrix could be:
0 2.694 1 9.665 2 0.393 3 0.258
0 6.539 1 0.910 2 2.209 3 1.342
0 8.469 1 3.565 2 0.839 3 0.127
0 2.719 1 2.748 2 0.604 3 6.929
0 0.946 1 3.771 2 5.939 3 1.344
0 1.638 1 11.346 2 0.016
=head1 INPUTS
The generateMatrix function can take 4 parameters:
=over 4
=item 1. Single dimensional array containing row marginals (Can be real valued or integers)
=item 2. Single dimensional array containing column marginals (Can be real valued or integers)
=item 3. Precision: For the integer valued marginal specifying "-". For real valued marginals specify the required precision for the generated matrix values. (Recommended Precision = 4)
=item 4. Seed: Seed for the random number generator (Default: None) (Optional parameter)
=back
=head1 OUTPUT
The generateMatrix function returns a two dimensional array containing the generated random matrix.
The generated matrix is stored in sparse format in this returned array. That is, only non-zero values
are stored in this matrix. Thus to access the values in the returned matrix one can use:
for(my $row=0; $i<=$num_rows; $i++)
{
for(my $col=0; $j<=$num_cols; $j++)
{
if(defined $returned_matrix[$row][$col])
{
print "$col $returned_matrix[$row][$col] ";
}
}
print "\n";
}
=head1 DESCRIPTION
This module generates a random matrix given the row and column marginals in such a way that
the row and column marginals of the resultant matrix are same as the given marginals.
If the given marginals are real valued then the generated cell values are real too. If the
given marginals are integer valued then the generated cell values are integers. If any of
the marginals are negative then few/all of the generated cell values would be negative too.
=head1 FURTHER DETAILS
For example, given the following marginals this module would generate the appropriate
values for "x"s such that the row and the column marginals are held fixed.
x x x x x | 3
x x x x x | 2
x x x x x | 3
x x x x x | 2
------------------------------
2 2 2 2 2 | 10
The algorithm we have used here:
For each cell while traversing the matrix in in row-major interpretation.
1. Generate random number using the steps given below.
2. Reduce row and column marginals by value of generated value.
End for.
Done.
Random number generation algorithm:
for each cell C(i,j)
{
# Find the range (min, max) for the random number generation
max = MIN(row_marg[i], col_marg[j])
# If max !=0 then decide the min.
# To decide min value sum together the col_marginals for all
# the columns past the current column - this sum gives the total
# of the column marginals yet to be satisfied beyond the current col.
# Subtract this sum from the current row_marginal to compute
# the lower bound on the random number. We do this because if we
# do not set this lower bound and thus a number smaller than this
# bound is generated then we will have a situation where satisfying
# both row_marginal and column marginals will be impossible.
( run in 1.617 second using v1.01-cache-2.11-cpan-39bf76dae61 )