在Perl中识别矩阵中的子数组
我对Perl相对较新,我需要进行相对复杂的基质计算,并且不知道要使用哪种数据结构.
不确定这是否适合这个论坛,但是说你在Perl中的多维数组中有以下矩阵: 0.2 0.7 0.2 0.6 0.8 0.7 0.6 0.1 0.8 0.1 0.2 0.9 0.6 0.3 0.0 0.6 0.9 0.2 我正在尝试识别此Matrix中的列段,其对应于高于给定阈值的连续值,例如,0.5 例如,如果我们对此矩阵进行阈值处理,我们有: 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 如果我们现在关注第一列: 0 1 1 0 1 1 我们可以看到有两个连续的部分:
>第一个轨道(一个序列)以索引1开始,以索引2结束 我想在原始矩阵中检测所有这些轨道,但我不知道如何继续或者Perl数据结构最适合于此. 理想情况下,我想要一些易于索引的东西,例如假设我们使用变量轨道,我可以存储第一列(索引0)的索引,如下所示: # First column,first track $tracks{0}{0}{'start'} = 1; $tracks{0}{0}{'end'} = 2; # First column,second track $tracks{0}{1}{'start'} = 4; $tracks{0}{1}{'end'} = 5; # ... 我可以使用什么样的数据结构和/或库来解决Perl中的这个问题? 解决方法
这似乎做你想要的.我已经以您建议的形式表示数据,因为理想的形式完全取决于您想要对结果做什么
它的工作原理是计算每列的0和1列表,在每一端添加零值(一个在$prev中,一个在for列表中),然后在列表中扫描1到0之间的变化 每次发现更改时,都会记录轨道开始或结束.如果未定义$start,则将当前索引记录为段的开始,否则当前段以小于当前索引的一个结束.使用开始和结束键构建散列,并将其推送到@segments数组. 最后一组嵌套循环以您在问题中显示的形式转储计算数据 use strict; use warnings; use constant THRESHOLD => 0.5; my @data = ( [ qw/ 0.2 0.7 0.2 / ],[ qw/ 0.6 0.8 0.7 / ],[ qw/ 0.6 0.1 0.8 / ],[ qw/ 0.1 0.2 0.9 / ],[ qw/ 0.6 0.3 0.0 / ],[ qw/ 0.6 0.9 0.2 / ],); my @tracks; for my $colno (0 .. $#{$data[0]}) { my @segments; my $start; my $prev = 0; my $i = 0; for my $val ( (map { $_->[$colno] > THRESHOLD ? 1 : 0 } @data),0 ) { next if $val == $prev; if (defined $start) { push @segments,{ start => $start,end=> $i-1 }; undef $start; } else { $start = $i; } } continue { $prev = $val; $i++; } push @tracks,@segments; } # Dump the derived @tracks data # for my $colno (0 .. $#tracks) { my $col = $tracks[$colno]; for my $track (0 .. $#$col) { my $data = $col->[$track]; printf "$tracks[%d][%d]{start} = %dn",$colno,$track,$data->{start}; printf "$tracks[%d][%d]{end} = %dn",$data->{end}; } print "n"; } 产量 $tracks[0][0]{start} = 1 $tracks[0][0]{end} = 2 $tracks[0][1]{start} = 4 $tracks[0][1]{end} = 5 $tracks[1][0]{start} = 0 $tracks[1][0]{end} = 1 $tracks[1][1]{start} = 5 $tracks[1][1]{end} = 5 $tracks[2][0]{start} = 1 $tracks[2][0]{end} = 3 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |