は、私は、次のスパース行列Aキャプチャ非ゼロ要素、カウントおよびインデックス
2 3 0 0 0
3 0 4 0 6
0 -1 -3 2 0
0 0 1 0 0
0 4 2 0 1
を持ってそれから私は、そこから次の情報をキャプチャしたいと思います:
累積行列が列方向に走査されるので、エントリの数。 収穫:
Ap = [0,2,5,9,10,12];
行のインデックスは、行列が列方向にスキャンされるためです。 収量:
Ai = [0,1,0,2,4,1,2,3,4,2,1,4];
行列が列方向にスキャンされるため、ゼロでない行列エントリ。 降伏:
Ax = [2,3,3、-1,4,4、-3,1,2,2,6,1];
実行列Aが大きいvery2潜在的であるので、これらの要素を取り込むことができるPerlで任意の効率的な方法 はありますか?特に、すべての行列AをRAMにスラピングすることなく、 をRAMに入れます。
次のコードが付いています。それは私が望むものを与えない。
use strict;
use warnings;
my (@Ax, @Ai, @Ap) =();
while (<>) {
chomp;
my @elements = split /\s+/;
my $i = 0;
my $new_line = 1;
while (defined(my $element = shift @elements)) {
$i++;
if ($element) {
push @Ax, 0 + $element;
if ($new_line) {
push @Ai, scalar @Ax;
$new_line = 0;
}
push @Ap, $i;
}
}
}
push @Ai, 1 + @Ax;
print('@Ax = [', join(" ", @Ax), "]\n");
print('@Ai = [', join(" ", @Ai), "]\n");
print('@Ap = [', join(" ", @Ap), "]\n");
@foolishbratところで、 '印刷 "\ @Ax = [@Ax]を\ n" を比較します。あなたが持っているものに。 –