転置行列を求める

転置行列を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";

関連情報