加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中识别矩阵中的子数组

发布时间:2020-12-16 06:16:59 所属栏目:大数据 来源:网络整理
导读:我对Perl相对较新,我需要进行相对复杂的基质计算,并且不知道要使用哪种数据结构. 不确定这是否适合这个论坛,但是说你在Perl中的多维数组中有以下矩阵: 0.2 0.7 0.2 0.6 0.8 0.70.6 0.1 0.80.1 0.2 0.90.6 0.3 0.00.6 0.9 0.2 我正在尝试识别此Matrix中的列
我对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

我们可以看到有两个连续的部分:

0 1 1 0 1 1

>第一个轨道(一个序列)以索引1开始,以索引2结束
>第二个轨道(一个序列)以索引4开始,以索引5结束

我想在原始矩阵中检测所有这些轨道,但我不知道如何继续或者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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读