Матрицы Матриц в Perl - PullRequest
9 голосов
/ 04 марта 2009

В скрипте Perl, над которым я работаю, мне нужно построить матрицу из нескольких других матриц. Я смотрел на пару модулей в CPAN ( Math :: Matrix , PDL :: Matrix , Math :: Cephes :: Matrix ), но ни один из них, кажется, не поддерживает это.

В Октаве это очень просто. Вот пример чего-то похожего на то, что я пытаюсь сделать:

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

Кажется, что попытка сделать это сама могла бы быстро запутаться, поэтому, вероятно, поэтому эти модули не поддерживают это ... Кто-нибудь еще когда-либо нуждался в этом? Вы решили это?

Ответы [ 3 ]

5 голосов
/ 04 марта 2009

Прокатить свой не слишком больно.

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 голосов
/ 25 апреля 2012

Язык данных Perl (PDL) версии 2.4.10 поддерживает удобный ввод в стиле MATLAB для конструктора pdl при использовании строкового аргумента и могут использоваться процедуры append и glue вставить подмассивы вместе, как показано в этом сеансе pdl2:

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 и списки рассылки PDL являются важными источниками для получения дополнительной информации о PDL.

0 голосов
/ 04 марта 2009

EDIT

Я неправильно понял OP, думая, что они хотели перебрать все возможные перестановки нескольких матриц (что делает Iterator :: Array :: Jagged).


Взгляните на 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...