hhayakawaの日記: Perlで多次元配列
日記 by
hhayakawa
Perlで転置行列を作ろうとして多次元配列と格闘しました。
以下、それに関連したスクリプト例です。
#!/usr/local/bin/perl
my $matrix;
# 行を追加
push(@{$matrix->[0]}, split(",", "1,2,3,4,5"));
push(@{$matrix->[1]}, split(",", "2,4,6,8,10"));
push(@{$matrix->[2]}, split(",", "3,6,9,12,15"));
# 行列を表示
&print_matrix($matrix);
# 転置行列を得る
my $t_matrix = &tranpose_matrix($matrix);
# 転置行列を表示
&print_matrix($t_matrix);
# 元の行列を行毎に表示
for my $i(0..@$matrix-1) {
&print_vector($matrix->[$i]);
}
# 転置行列を得る
sub tranpose_matrix {
my $arg = shift;
my $ret;
my ($i, $j);
for $i(0..@{$arg->[0]}-1) {
for $j(0..@{$arg}-1) {
push(@{$ret->[$i]}, $arg->[$j][$i]);
}
}
return $ret;
}
# 1次元配列の内容を表示
sub print_vector {
my $v = shift;
print '[' . scalar(@$v) . ']' . " : ";
print join (", ", @$v);
print "\n";
}
# 2次元配列の内容を表示
sub print_matrix {
my $m = shift;
my ($i, $j);
$i = scalar(@{$m});
$j = scalar(@{$m->[0]});
print qq![$i]x[$j]:\n!;
for $i(0..@{$m}-1) {
printf qq!%4d : !, $i;
for $j(0..@{$m->[0]}-1) {
printf qq!%4d!, $m->[$i][$j];
}
print qq!\n!;
}
}
以下、それに関連したスクリプト例です。
#!/usr/local/bin/perl
my $matrix;
# 行を追加
push(@{$matrix->[0]}, split(",", "1,2,3,4,5"));
push(@{$matrix->[1]}, split(",", "2,4,6,8,10"));
push(@{$matrix->[2]}, split(",", "3,6,9,12,15"));
# 行列を表示
&print_matrix($matrix);
# 転置行列を得る
my $t_matrix = &tranpose_matrix($matrix);
# 転置行列を表示
&print_matrix($t_matrix);
# 元の行列を行毎に表示
for my $i(0..@$matrix-1) {
&print_vector($matrix->[$i]);
}
# 転置行列を得る
sub tranpose_matrix {
my $arg = shift;
my $ret;
my ($i, $j);
for $i(0..@{$arg->[0]}-1) {
for $j(0..@{$arg}-1) {
push(@{$ret->[$i]}, $arg->[$j][$i]);
}
}
return $ret;
}
# 1次元配列の内容を表示
sub print_vector {
my $v = shift;
print '[' . scalar(@$v) . ']' . " : ";
print join (", ", @$v);
print "\n";
}
# 2次元配列の内容を表示
sub print_matrix {
my $m = shift;
my ($i, $j);
$i = scalar(@{$m});
$j = scalar(@{$m->[0]});
print qq![$i]x[$j]:\n!;
for $i(0..@{$m}-1) {
printf qq!%4d : !, $i;
for $j(0..@{$m->[0]}-1) {
printf qq!%4d!, $m->[$i][$j];
}
print qq!\n!;
}
}
Perlで多次元配列 More ログイン