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千円(現在)支給されるというもの。
ありがたや。