2009-03-03 11 views
9

W skrypcie Perla nad którym pracuję, potrzebuję zbudować matrycę z kilku innych macierzy. Spojrzałem na kilka modułów w CPAN (Math::Matrix, PDL::Matrix, Math::Cephes::Matrix), ale żaden z nich nie obsługuje tego.Matryce z matryc w Perlu

Oktawa to bardzo proste. Oto przykład czegoś podobnego do tego, co próbuję zrobić:

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 

Wydaje się próbuje to zrobić sam dostanie brudny trochę szybko, co jest prawdopodobnie dlaczego te moduły nie obsługują ... Czy ktokolwiek inny kiedykolwiek miał taką potrzebę? Rozwiązałeś to?

+0

Może być w stanie udzielić lepszej odpowiedzi, jeśli wiemy, czego używasz do ... – flussence

+0

Ponieważ nie masz reputacji, aby opublikować komentarz, możesz odpowiedzieć, edytując to pytanie. –

Odpowiedz

5

Rolowanie własne nie jest zbyt bolesne.

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

To działało pięknie. Nie mogę wrócić do tymczasowego konta, z którego zadałem to pytanie, ale gdy tylko połączę to konto z tym, zaznaczę to jako zaakceptowane. Jestem trochę zdezorientowany- co to jest \ @ \ @; \ @ \ @ \ @ \ @ \ @ \ @? –

+0

Prototypy funkcji - nie są często używane w Perlu 5. W tym przypadku zapobiega to zmiażdżeniu argumentów macierzy; możesz rzucić cały prototyp i użyć 'hmerge (\ @ A, \ @ B) zamiast tego. – ephemient

-1

EDIT

ja źle OP, myśląc że chcieli iteracyjne nad wszystkich możliwych permutacji kilku matrycach (czyli to, co robi Iterator :: Array :: Jagged).


Spójrz na Iterator::Array::Jagged

Oto przykład z STRESZCZENIE:

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

Przykładowy kod powyższego kodu drukuje następujące:

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

Nie widzę, jak to pomaga? Przykład OP składa się z dużej matrycy z mniejszych matryc. – ephemient

+0

Całkowicie źle zrozumiałem pytanie. Myślałem, że PO obejmuje iterację poprzez wszystkie możliwe permutacje wielu macierzy. – JDrago

0

Perl Data Language (PDL) wersja 2.4.10 obsługuje wygodę w stylu MATLAB ut dla konstruktora pdl przy użyciu argumentu ciąg i append i glue procedury mogą być stosowane do wklejenia subarrays razem jak ta sesja pdl2 pokazuje:

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 book i PDL mailing lists są podstawowymi źródłami, aby uzyskać więcej informacji na temat PDL.