2009-03-03 16 views
9

私が進めているPerlスクリプトでは、他のいくつかの行列から行列を構築する必要があります。私はCPAN(Math::MatrixPDL::MatrixMath::Cephes::Matrix)のいくつかのモジュールを見てきましたが、これらのどれもこれをサポートしていないようです。Perl内の行列の行列

これは非常に簡単です。 ...それは自分自身がこれらのモジュールがそれをサポートしていない理由は、おそらくある、ちょっとすぐに厄介になるだろうこれをやろうとしているようだ

octave:1> A = [ 1, 2; 3, 4 ] 
A =  
    1 2 
    3 4 

octave:2> B = [ 5, 6; 7, 8 ] 
B =  
    5 6 
    7 8 

octave:3> C = [ 9, 10; 11, 12 ] 
C =  
    9 10 
    11 12 

octave:4> D = [ 13, 14; 15, 16 ] 
D =  
    13 14 
    15 16 

octave:5> E = [ A, B; C, D ] 
E =  
    1 2 5 6 
    3 4 7 8 
    9 10 13 14 
    11 12 15 16 

持っている:ここで私がやろうとしているものと同様のものの一例ですそこの誰もがこれを必要としていたのですか?あなたはそれを解決しましたか?

+0

あなたがそれらを使用していることがわかっている場合、より良い答えを出すことができるかもしれません... – flussence

+0

コメントを投稿する評判がないので、質問自体を編集して返信してください。 –

答えて

5

あなた自身をローリングするのはあまりにも苦痛ではありません。

use List::Util qw(max); 

@A = ([1, 2], [3, 4]); 
@B = ([5, 6], [7, 8]); 
@C = ([9, 10], [11, 12]); 
@D = ([13, 14], [15, 16]); 

sub hmerge(\@\@;\@\@\@\@\@\@) { 
    my @ret; 
    for my $i (0 .. max map $#$_, @_) { 
     push @ret, [map @{$$_[$i]}, @_]; 
    } 
    @ret; 
} 

@E = (hmerge(@A, @B), hmerge(@C, @D)); 
+0

これは美しく機能しました。私はこの質問をするのに使った一時的な口座に戻れませんが、口座をこの口座に合併するとすぐに、これを受け入れたものとしてマークします。 私はちょっと混乱しますが、何が\ @ \ @; \ @ \ @ \ @ \ @ @ @ @ @ @は何ですか? –

+0

関数のプロトタイプ - Perl 5では頻繁に使用されていません。ここでは、配列の引数を壊すのを防ぎます。プロトタイプ全体を削除し、代わりに 'hmerge(\ @ A、\ @B)'を使うことができます。 – ephemient

-1

EDIT

私は、彼らが(イテレータ::アレイ::ギザギザが何をするかである)、いくつかの行列のすべての可能な順列を反復処理したいと考え、OPを誤解。


ここIterator::Array::Jagged

を見てシノプシスの例である:コード上記のコードで

use Iterator::Array::Jagged; 

# Build up a set of data: 
my @data = (
    [qw/ a b /], 
    [qw/ c d /], 
    [qw/ e f g /] 
); 

# Iterator is a subref: 
my $itersub = Iterator::Array::Jagged->get_iterator(@data); 
while(my @set = $itersub->()) 
{ 
    print "Next set: '" . join("&", @set) . "'\n"; 
}# end while() 

例では、次の印刷:

Next set: 'a&c&e' 
Next set: 'b&c&e' 
Next set: 'a&d&e' 
Next set: 'b&d&e' 
Next set: 'a&c&f' 
Next set: 'b&c&f' 
Next set: 'a&d&f' 
Next set: 'b&d&f' 
Next set: 'a&c&g' 
Next set: 'b&c&g' 
Next set: 'a&d&g' 
Next set: 'b&d&g' 
+0

これはどのように役立ちますか? OPの例は、より小さな行列から大きな行列を構成します。 – ephemient

+0

私は完全にその質問を誤解しました。私は、OPが複数の行列のすべての可能な順列を反復することを含むと考えました。 – JDrago

0

Perl Data Language(PDL)バージョン2.4.10は、MATLABスタイルの便利なinp UTはpdlコンストラクタのための文字列引数を使用している場合、これpdl2セッションが示すようにappendglueルーチンが一緒にサブアレイを貼り付けるために使用することができます。

pdl> $A = pdl q[ 1, 2 ; 3, 4 ];  # pdl constructor with string argument 

pdl> $B = pdl q[ 5, 6 ; 7, 8 ];  # pdl constructor with string argument 

pdl> $C = pdl q[ 9, 10 ; 11, 12 ]; # pdl constructor with string argument 

pdl> $D = pdl q[ 13, 14 ; 15, 16]; # pdl constructor with string argument 

pdl> ?vars 
PDL variables in package main:: 

Name   Type Dimension  Flow State   Mem 
---------------------------------------------------------------- 
$A   Double D [2,2]    P   0.03KB 
$B   Double D [2,2]    P   0.03KB 
$C   Double D [2,2]    P   0.03KB 
$D   Double D [2,2]    P   0.03KB 


pdl> p $A, $B, $C, $D; 

[ 
[1 2] 
[3 4] 
] 

[ 
[5 6] 
[7 8] 
] 

[ 
[ 9 10] 
[11 12] 
] 

[ 
[13 14] 
[15 16] 
] 

pdl> p $AB = $A->append($B);   # concatenate horizontally (actually on dim(0)) 

[ 
[1 2 5 6] 
[3 4 7 8] 
] 

pdl> p $CD = $C->append($D);   # concatenate horizontally (actually on dim(0)) 

[ 
[ 9 10 13 14] 
[11 12 15 16] 
] 

pdl> p $E = $AB->glue(1,$CD);   # glue vertically (actually on dim(1)) 
[ 
[ 1 2 5 6] 
[ 3 4 7 8] 
[ 9 10 13 14] 
[11 12 15 16] 
] 

PDL bookPDL mailing listsは、PDLの詳細については、不可欠な情報源です。