2009-03-03 23 views
9

In einem Perl-Skript, an dem ich arbeite, muss ich eine Matrix aus mehreren anderen Matrizen erstellen. Ich habe ein paar Module in CPAN (Math::Matrix, PDL::Matrix, Math::Cephes::Matrix) angeschaut, aber keiner von diesen scheint dies zu unterstützen.Matrizen von Matrizen in Perl

In Octave ist dies sehr einfach. Hier ist ein Beispiel von etwas ähnlich, was ich versuche zu tun:

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 

Es scheint, versuchen, dies zu tun, würde ich chaotisch irgendwie schnell, was wahrscheinlich ist, warum diese Module nicht, es unterstützen ... Hat hat irgendjemand da draußen jemals ein Bedürfnis danach? Hast du es gelöst?

+0

Könnte in der Lage sein, eine bessere Antwort zu geben, wenn wir wissen, wofür Sie sie verwenden ... – flussence

+0

Da Sie nicht die Reputation haben, einen Kommentar zu posten, können Sie die Frage selbst bearbeiten. –

Antwort

5

Selbst rollen ist nicht zu schmerzhaft.

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

Das hat wunderbar funktioniert. Ich kann nicht zu dem temporären Konto zurückkehren, das ich verwendet habe, um diese Frage zu stellen, aber sobald ich dieses Konto mit diesem zusammenführe, werde ich dies als akzeptiert markieren. Ich bin ein wenig verwirrt obwohl - was ist \ @ \ @; \ @ \ @ \ @ \ @ \ @ \ @? –

+0

Funktionsprototypen, die in Perl 5 nicht häufig verwendet werden. Hier wird das Quetschen der Array-Argumente verhindert; Du könntest den ganzen Prototyp fallen lassen und statt dessen 'hmerge (\ @ A, \ @B)' verwenden. – ephemient

-1

EDIT

mißverstanden ich die OP, denken, dass sie wollten alle möglichen Permutationen von mehreren Matrizen iterieren (das, was Iterator ist :: Array :: Jagged tut).


Werfen Sie einen Blick auf Iterator::Array::Jagged

Hier ein Beispiel aus der Synopse ist:

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() 

Das Beispiel in dem obigen Code Code druckt die folgenden:

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

Ich sehe nicht, wie das hilft? Das Beispiel von OP setzt eine große Matrix aus kleineren Matrizen zusammen. – ephemient

+0

Ich habe die Frage völlig falsch verstanden. Ich dachte, das OP beinhaltete das Durchlaufen aller möglichen Permutationen mehrerer Matrizen. – JDrago

0

Die Perl Data Language (PDL) Version 2.4.10 unterstützt MATLAB-Stil Komfort-Inp ut für den pdl Konstruktor, wenn ein String-Argument verwenden und die append und glue Routinen verwendet werden können Sub-Arrays zusammen zu fügen, wie dies pdl2 Sitzung zeigt:

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] 
] 

Die PDL book und die PDL mailing lists sind wesentliche Quellen für weitere Informationen über PDL.