Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:从多列文件的每一列计算jackknife错误_Perl - Fatal编程技术网

Perl:从多列文件的每一列计算jackknife错误

Perl:从多列文件的每一列计算jackknife错误,perl,Perl,我试图计算多列文件中每列的jacknife平均值和错误。 我的示例数据文件如下所示: $ cat data.HW2 1.1 2.1 3.1 4.1 1.2 2.2 3.2 4.2 1.3 2.3 3.3 4.3 1.4 2.4 3.4 4.4 我尝试的解决方案是定义最终大小与列数相同的数组(在本例中为4),并逐行迭代: cat jackkinfe.pl #! /usr/bin/perl use warnings; use strict; my @n=0; my @x; my $j; my $

我试图计算多列文件中每列的jacknife平均值和错误。 我的示例数据文件如下所示:

$ cat data.HW2
1.1 2.1 3.1 4.1
1.2 2.2 3.2 4.2
1.3 2.3 3.3 4.3
1.4 2.4 3.4 4.4
我尝试的解决方案是定义最终大小与列数相同的数组(在本例中为4),并逐行迭代:

cat jackkinfe.pl

#! /usr/bin/perl
use warnings; use strict;
my @n=0;
my @x;
my $j;
my $i;
my $dg;
my @x_jack;
my @x_tot=0;
my $cols;
my $col_start=0;

# read in the data
while(<>)
{
  my @column = split();
  $cols=@column;
  foreach my $j ($col_start .. $#column) {
    $x[$n[$j]][$j] = $column[$j];
    $x_tot[$j] += $x[$n[$j]][$j];
    $n[$j]++;
  }
}
# Do the jackknife estimates
for ($j=$col_start; $j<$cols; $j++)
{
  for ($i = 0; $i < $n[$j]; $i++)
  {
    $x_jack[$i][$j] = ($x_tot[$j] - $x[$i][$j]) / ($n[$j] - 1);
  }
# Do the final jackknife estimate
  my @g_jack_av=0;
  my @g_jack_err=0;
  for ($i = 0; $i < $n[$j]; $i++)
  {
    $dg = $x_jack[$i][$j];
    $g_jack_av[$j] += $dg;
    $g_jack_err[$j] += $dg**2;
  }
  $g_jack_av[$j] /= $n[$j];
  $g_jack_err[$j] /= $n[$j];
  $g_jack_err[$j] = sqrt(($n[$j] - 1) * abs($g_jack_err[$j] - $g_jack_av[$j]**2));
  printf "%e %e ", $g_jack_av[$j], $g_jack_err[$j];
}
printf "\n";
但是我想根据数据文件的大小动态设置
@n
的大小

如何删除此警告

由于我正在努力学习最佳实践,因此欢迎您对我的Perl用法提出任何其他建议,并对此表示感谢。

这部分代码

my @n=0;
....
  foreach my $j ($col_start .. $#column) {
    $x[$n[$j]][$j] = $column[$j];
    $x_tot[$j] += $x[$n[$j]][$j];
    $n[$j]++;
  }
对于大于0的
$j
值,将触发警告一次,因为只有
@n
中的第一个元素被定义:
$n[0]=0
。只有在循环迭代结束时,当增量运算符使用
$n[$j]+
将数组值设置为
1
时,才会最终定义数组值

从技术上讲,代码仍将按预期工作,因为
undef
将转换为
0
。所以忽略警告应该是安全的。您可以在循环中执行类似操作以避免它:

$n[$j] //= 0;     # $n[$j] is defined, or set to 0
这相当于

if (not defined($n[$j])) {
    $n[$j] = 0;
}
$n[$j] //= 0;     # $n[$j] is defined, or set to 0
if (not defined($n[$j])) {
    $n[$j] = 0;
}