我编写了一个perl
脚本,以便在polymake
框架中实现。
该脚本完成以下任务。它的输入是来自$M
的矩阵polymake
。发布
print ref($M);
返回
Polymake::common::Matrix_A_Rational_I_NonSymmetric_Z
脚本的输出是一个矩阵,其行是从M
获得的行,它取所有M
行的所有子集的总和。例如,输入
1 0 0
1 3 0
1 0 3
返回
0 0 0
3 3 3
2 3 3
2 0 3
1 0 3
2 3 0
1 3 0
1 0 0
我的脚本代码是
use application 'polytope';
use Data::PowerSet 'powerset';
sub newVertices {
my ($orig) = @_;
my $n = $orig -> rows;
my $vert = zero_vector($n);
my $d = Data::PowerSet->new( {min => 1}, map {"$_"} (0..$n-1) );
while (my $r = $d -> next) {
my $v = new Vector($n);
foreach (@$r) {
$v += @$orig[$_];
}
$vert = $vert / $v;
}
return $vert;
}
脚本运行正常。我的问题是脚本的运行速度比我想象的要慢很多。我上面提到的例子大约需要半分钟才能运行。我的问题是
我是否认为对于行数相对较少的矩阵应该能够快速完成这样的任务?
为什么这个脚本这么慢?
有没有办法更有效地完成这项任务?
我怀疑问题可能是我正在处理它的矩阵对象类型,并且编写一个纯粹使用数组执行此操作的脚本可能更有效。我的问题是我无法弄清楚如何从一个数组转换回一个矩阵,所以我还没有试图在这些方面做一些事情。