Algorithm-Cluster
view release on metacpan or search on metacpan
perl/Cluster.pm view on Meta::CPAN
}
}
#-------------------------------------------------------------
# Wrapper for the median() function
#
sub median {
if(ref $_[0] eq 'ARRAY') {
return _median($_[0]);
} else {
return _median([@_]);
}
}
#------------------------------------------------------
# This function is called by the wrappers for library functions.
# It checks the dimensions of the data, mask and weight parameters.
#
# Return false if any errors are found in the data matrix.
#
# Detect the dimension (nrows x ncols) of the data matrix,
# and set values in the parameter hash.
#
# Also check the mask matrix and weight arrays, and set
# the parameters to default values if we find any errors,
# however, we still return true if we find errors.
#
sub check_matrix_dimensions {
my ($param, $default) = @_;
#----------------------------------
# Check the data matrix
#
return unless data_is_valid_matrix($param->{data});
#----------------------------------
# Remember the dimensions of the weight array
#
$param->{nrows} = scalar @{ $param->{data} };
$param->{ncols} = scalar @{ $param->{data}->[0] };
#----------------------------------
# Check the mask matrix
#
unless (data_is_valid_matrix($param->{mask})) {
module_warn("Parameter 'mask' is not a valid matrix, ignoring it.");
$param->{mask} = $default->{mask}
} else {
my $mask_nrows = scalar @{ $param->{mask} };
my $mask_ncols = scalar @{ $param->{mask}->[0] };
unless ($param->{nrows} == $mask_nrows and $param->{ncols} == $mask_ncols) {
module_warn("Data matrix is $param->{nrows}x$param->{ncols}, but mask matrix is ${mask_nrows}x${mask_ncols}.\nIgnoring the mask.");
$param->{mask} = $default->{mask};
}
}
#----------------------------------
# Check the weight array
#
unless(ref $param->{weight} eq 'ARRAY') {
module_warn("Parameter 'weight' does not point to an array, ignoring it.");
$param->{weight} = $default->{weight};
} else {
my $weight_length = scalar @{ $param->{weight} };
if ($param->{transpose} eq 0) {
unless ($param->{ncols} == $weight_length) {
module_warn("Data matrix has $param->{ncols} columns, but weight array has $weight_length items.\nIgnoring the weight array.");
$param->{weight} = $default->{weight}
}
}
else {
unless ($param->{nrows} == $weight_length) {
module_warn("Data matrix has $param->{nrows} rows, but weight array has $weight_length items.\nIgnoring the weight array.");
$param->{weight} = $default->{weight}
}
}
}
return 1;
}
sub check_distance_matrix {
my $distances = $_[0];
my $i;
my $row;
my $column;
#----------------------------------
# Check the data matrix
#
my $reference = ref($distances);
if (!$reference) {
return "Wanted array reference but did not receive a reference";
}
elsif ($reference ne 'ARRAY') {
return "Wanted array reference, but got a $reference";
}
my $nobjects = scalar @{ $distances };
unless ($nobjects > 0) {
return "Distance matrix has zero rows";
}
$i = 0;
foreach $row (@{ $distances}) {
unless (defined $row) {
return "Row $i is undefined";
}
unless (ref($row) eq 'ARRAY') {
return "Row $i is not an array";
}
unless (@{$row} == $i) {
return "Row $i has incorrect columns";
}
foreach $column (@{$row}) {
unless (defined($column)) {
return "Row $i contains undefined columns";
}
}
$i++;
}
return "OK";
}
sub check_initialid {
my ($param, $default, $nobjects) = @_;
my $i;
my @counter = {};
#----------------------------------
# Check the initial clustering solution, if specified
#
if(ref $param->{initialid} ne 'ARRAY') {
module_warn("Optional parameter 'initialid' should be an array");
return;
}
if (@{ $param->{initialid}} == 0) {
( run in 3.284 seconds using v1.01-cache-2.11-cpan-140bd7fdf52 )