長さの違う配列同士の計算

せっかく、毎日何か書こうと思ったら1日空いちゃった。
でも、とりあえず、何か書こうと思う。
という訳で、今回は長さの違う配列を足してみる。

まずは、こんな感じで配列を定義する。

use strict;
use warnings;
use v5.10;

use PDL;

my $a = pdl( 1, 2, 3 );
my $b = pdl( 4, 5 );

say $a;
say $b;

もちろん、結果はこんな感じ。
$ perl aaa.pl
[1 2 3]
[4 5]

次は、これらを足してみる。

use strict;
use warnings;
use v5.10;

use PDL;

my $a = pdl( 1, 2, 3 );
my $b = pdl( 4, 5 );

say $a + $b;

このままだと、エラーになる。
$ perl bbb.pl
PDL: PDL::Ops::plus(a,b,c): Parameter 'b':
Mismatched implicit thread dimension 0: should be 3, is 2
at bbb.pl line 10.

という訳で、あまりスマートじゃないけど、
解決方法はこんな感じ。

use strict;
use warnings;
use v5.10;

use PDL;

my $a = pdl( 1, 2, 3 );
my $b = pdl( 4, 5 );

my $dst = zeros( 0 );
foreach my $src ( $a, $b ) {
    if ( $dst->nelem < $src->nelem ) {
        $dst = $dst->append( zeros($src->nelem - $dst->nelem) );
    }
    elsif ( $src->nelem < $dst->nelem ) {
        $src = $src->append( zeros($dst->nelem - $src->nelem) );
 
    }

    $dst += $src;
}

say $dst;

結果はこうなる。
$ perl ccc.pl
[5 7 3]

という訳で、appendの紹介でした。
他に良い方法があれば教えてください。

おしまい。

Leave a Comment