gpt4 book ai didi

perl - 捕获稀疏矩阵的非零元素、计数和索引

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:39 27 4
gpt4 key购买 nike

我有以下稀疏矩阵 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

然后我想从那里获取以下信息:

  1. 条目的累计计数,因为矩阵是按列扫描的。产量:

    Ap = [ 0, 2, 5, 9, 10, 12 ];

  2. 条目的行索引,因为矩阵是按列扫描的。产量:

    Ai = [0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4 ];

  3. 非零矩阵条目,因为矩阵是按列扫描的。产量:

    Ax = [2, 3, 3, -1, 4, 4, -3, 1, 2, 2, 6, 1];

由于实际矩阵 A 可能非常大,有没有什么有效的方法在 Perl 中可以捕获那些元素?特别是在不吞噬所有矩阵 A 的情况下进入 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");

最佳答案

存储稀疏数据的常见策略是删除您不关心的值(零),并存储行和列索引以及您关心的每个值,从而保留它们的位置信息:

[VALUE, ROW, COLUMN]

在您的情况下,您可以进一步节省开支,因为您的所有需求都可以通过逐列处理数据来满足,这意味着我们不必为每个值重复 COLUMN。

use strict;
use warnings;
use Data::Dumper;

my ($r, $c, @dataC, @Ap, @Ai, @Ax, $cumul);

# Read data row by row, storing non-zero values by column.
# $dataC[COLUMN] = [
# [VALUE, ROW],
# [VALUE, ROW],
# etc.
# ]
$r = -1;
while (<DATA>) {
chomp;
$r ++;
$c = -1;
for my $v ( split '\s+', $_ ){
$c ++;
push @{$dataC[$c]}, [$v, $r] if $v;
}
}

# Iterate through the data column by column
# to compute the three result arrays.
$cumul = 0;
@Ap = ($cumul);
$c = -1;
for my $column (@dataC){
$c ++;
$cumul += @$column;
push @Ap, $cumul;
for my $value (@$column){
push @Ax, $value->[0];
push @Ai, $value->[1];
}
}

__DATA__
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

关于perl - 捕获稀疏矩阵的非零元素、计数和索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1326605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com