転置行列を求める
転置行列をPerlで求めてみましょう。転置行列とは、行と列が入れ替わった行列のことです。転置行列の計算は、逆誤伝播法で必要になります。
行列は列優先の行列だと考えてください。
# 数学の行列表現 # 3行2列の行列 # 1 4 # 2 5 # 3 6 # 列優先でのデータのもちかた my $mat = { values => [1, 2, 3, 4, 5, 6], rows_length => 3, columns_length => 2, };
この行列を転置するとすると以下のようになります。行と列が入れ替わります。
# 転置行列 # 数学の行列表現 # 2行3列の行列 # 1 2 3 # 4 5 6 # 列優先でのデータのもちかた my $mat_transpose = { values => [1, 4, 2, 5, 3, 6], rows_length => 2, columns_length => 3, };
転置行列を求めるPerlプログラム
転置行列を求めるPerlプログラムを書いてみます。
use strict; use warnings; sub mat_transpose { my ($mat) = @_; my $rows_length = $mat->{rows_length}; my $columns_length = $mat->{columns_length}; my $length = $rows_length * $columns_length; my $mat_trans ={}; $mat_trans->{rows_length} = $columns_length; $mat_trans->{columns_length} = $rows_length; my $values = $mat->{values}; my $mat_trans_values = []; for (my $row_index = 0; $row_index < $rows_length; $row_index++) { for (my $column_index = 0; $column_index < $columns_length; $column_index++) { $mat_trans_values->[$row_index * $columns_length + $column_index] = $values->[$column_index * $rows_length+ $row_index]; } } $mat_trans->{values} = $mat_trans_values; return $mat_trans; } my $mat = { values => [1, 2, 3, 4, 5, 6], rows_length => 3, columns_length => 2, }; my $mat_trans = mat_transpose($mat); # Row:2, Column:3, Values:1 4 2 5 3 6 print "Row:$mat_trans->{rows_length}, Column:$mat_trans->{columns_length}, Values:@{$mat_trans->{values}}\n";