| 0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 1 | |
| 1 | 0 | 2 | 1 | 3 | 0 | |
| 5 | 1 | 3 | 0 | 3 | 3 | |
| 1 | 0 | 8 | 3 | 11 | 0 | |
| 19 | 1 | 11 | 0 | 11 | 11 |
#!/usr/bin/perl
use strict;
use warnings;
my $L_ref = [map {chomp; [split(/\s+/, $_)]} <DATA>];
my $Lt_ref = transpose($L_ref);
my $LtL_ref = multiply($Lt_ref, $L_ref);
print_matrix($LtL_ref);
my $x_ref;
foreach (@$L_ref) {
push @$x_ref, [1];
}
for (my $i = 0; $i < 20; $i++) {
$x_ref = normalize(multiply($LtL_ref, $x_ref));
}
print_vector($x_ref);
my $y_ref = normalize(multiply($L_ref, $x_ref));
print_vector($y_ref);
sub transpose {
my ($m_ref) = @_;
my @rv;
for (my $i = 0; $i < @$m_ref; $i++) {
for (my $j = $i; $j < @{$m_ref->[0]}; $j++) {
$rv[$j][$i] = $m_ref->[$i][$j];
$rv[$i][$j] = $m_ref->[$j][$i];
}
}
return \@rv;
}
sub multiply {
my ($m1_ref, $m2_ref) = @_;
my @rv;
for (my $i = 0; $i < @$m1_ref; $i++) {
for (my $j = 0; $j < @{$m2_ref->[0]}; $j++) {
for (my $z = 0; $z < @$m2_ref; $z++) {
$rv[$i][$j] += $m1_ref->[$i][$z] * $m2_ref->[$z][$j];
}
}
}
return \@rv;
}
sub normalize {
my ($v_ref) = @_;
my @rv;
my $sum = 0;
foreach my $i (@$v_ref) {
$sum += $i->[0];
}
foreach my $i (@$v_ref) {
push @rv, [$i->[0] / $sum];
}
return \@rv;
}
sub print_vector {
my ($m_ref) = @_;
print join("\n", map {sprintf "%.4f", $_->[0]} @$m_ref), "\n\n";
}
sub print_matrix {
my ($m_ref) = @_;
print join("\n", map {"@$_"} @$m_ref), "\n\n";
}
__DATA__
0 0 1 0 1 0
1 0 0 0 0 0
0 0 0 0 1 0
0 0 0 0 0 0
0 0 1 1 0 0
0 0 0 0 1 0
% ./naive-hits-mini.pl 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 0 0 0 1 1 0 0 0 0 1 0 3 0 0 0 0 0 0 0 0.0000 0.0000 0.3660 0.1340 0.5000 0.0000 0.3660 0.0000 0.2113 0.0000 0.2113 0.2113

「子ども手当」。
これは中学校修了まで月額1万3千円(現在)支給されるというもの。
ありがたや。