Perl中的矩阵
在我正在编写的Perl脚本中,我需要用其他几个矩阵构建一个矩阵。我已经研究了CPAN(,)中的几个模块,但这些模块似乎都不支持这一点 在八度音阶中,这很容易。下面是一个类似于我尝试做的事情的示例:Perl中的矩阵,perl,matrix,Perl,Matrix,在我正在编写的Perl脚本中,我需要用其他几个矩阵构建一个矩阵。我已经研究了CPAN(,)中的几个模块,但这些模块似乎都不支持这一点 在八度音阶中,这很容易。下面是一个类似于我尝试做的事情的示例: 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
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
似乎自己尝试这样做会很快变得混乱,这可能就是为什么这些模块不支持它。。。还有其他人需要这个吗?你解决了吗?自己滚也不太痛苦
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));
编辑
我误解了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'
(PDL)版本2.4.10支持在使用字符串参数时为PDL
构造函数提供MATLAB风格的方便输入,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更多信息的重要来源。如果我们知道您使用它们的目的,可能会给出更好的答案…因为您没有发表评论的声誉,请随意编辑问题本身来回答。我不知道这有什么帮助?OP的例子由较小的矩阵组成一个较大的矩阵。我完全误解了这个问题。我认为OP涉及到对多个矩阵的所有可能排列进行迭代。这非常有效。我无法回到我以前问这个问题的临时帐户,但一旦我将该帐户与此帐户合并,我会将其标记为已接受。但是我有点困惑-什么是\@;\\\\\\\\\\\\\\\@?函数原型——在Perl5中不经常使用。在这里,它可以防止数组参数的挤压;您可以放弃整个原型,改用
hmerge(\@A,\@B)
。