z这样呀~

#!usr/bin/perl -w
use 5.010;


$a[0][1]=0.1;  $a[0][2]=0.2;  $a[0][3]=0.6;  $a[0][4]=0.1; # 4
starting probs
$a[1][0]=0.1;  $a[2][0]=0.2;  $a[3][0]=0.6;  $a[4][0]=0.1; # 4 ending
probs
$a[1][1]=0.1;  $a[1][2]=0.7;  $a[1][3]=0.1;  $a[1][4]=0.1;
$a[2][1]=0.1;  $a[2][2]=0.75;  $a[2][3]=0.1;  $a[2][4]=0.05;
$a[3][1]=0.3;  $a[3][2]=0.2;  $a[3][3]=0.4;  $a[3][4]=0.1;
$a[4][1]=0.2;  $a[4][2]=0.2;  $a[4][3]=0.4;  $a[4][4]=0.2;

@lamda=(0,1,8,4,30);

sub Poi # $_[0] is lambda, $_[1] is x.
{
   $aa=exp(-$_[0])*$_[0]**$_[1];
   if($_[1]>1)
   {
      foreach $frac(1..$_[1]) { $aa=$aa/$frac; }
   }
   $aa;
}

 if(!open OUT, ">", "nor_debug") { die "can't open processing middle
file for nor!"; }

$delta=1;
$itr=1;
while(($delta>0.00001)&&($itr<100000))
{
   say OUT "begin itr: $itr";
   foreach $ch(1..22)
   {
      if(!open IN, "<", "nor$ch.fs") { die "can't open full sites for
chromosome $ch!"; }


      @x=(0);
      $L=0;
      while(<IN>)
      {
         chomp;
         if(/\d+\t(\d+)/) { push(@x,$1); $L++;}
      }
      close IN;
      @s=();
      @f=();
      $f[0][0]=1; $f[1][0]=0; $f[2][0]=0; $f[3][0]=0; $f[4][0]=0;
      $s[0]=1;
      foreach $m(1..4)
      {
         $f[$m][1] += &Poi($lamda[$m],$x[1]) * $a[0][$m];
         $s[1] += $f[$m][1];
      }
      foreach $m(1..4)
      {
         $f[$m][1]/=$s[1];
      }

      foreach $i(2..$L)
      {
         $im=$i-1;
         foreach $k(1..4)
         {
            foreach $q(1..4)
            {
               $f[$k][$i] += $f[$q][$im] * $a[$q][$k];
            }
            $f[$k][$i] *= &Poi($lamda[$k],$x[$i]);
            $s[$i] += $f[$k][$i];
         }
         foreach $k(1..4)
         {
            $f[$k][$i]/=$s[$i];
         }
      }

      foreach $k(1..4)  # calcu P(X)!
      {
         $px+=$f[$k][$L]*$a[$k][0];
      }
      say OUT "finished XX for chromosome $ch!";
......

呐,就两个say之间,砍到while后面没有,while里面什么也不做的时候就可以say OUT了。。。
ps那个f[$k]是一个有150w个以上的分量的数组,我算到100万多一点的时候就变成-NaN了。。。。。。这又是另一个问题了。。。。。

On 11月27日, 下午9时31分, cnhack TNT <[email protected]> wrote:
> 额。。。麻烦多贴些相关代码成么? 不然要大家瞎子摸黑怎么个帮法儿?
> 你都说了,砍掉一些语句就有输出了,那不就是你砍掉的语句有问题么,贴上来分析分析不就清楚了?
>
> 2011/11/27 mandova <[email protected]>
>
>
>
> > if(!open OUT,">","<文件名>" ) { die "..."; }
> > 一直都是这样写的页没有出问题。。。程序一开始运行就应该有一个输出的,但是say OUT没有,如果只是say就有在屏幕上。我把两个应该有输出的地
> > 方之间的语句砍到一定程度就可以say OUT了。。。
>
> > On 11月27日, 下午8时31分, 昨夜星尘 <[email protected]> wrote:
> > > 你的OUT是怎么定义的?定义错误也会出现这种情况。写文件用不了多少内存。
>
> > > On 11月27日, 下午4时28分, mandova <[email protected]> wrote:
>
> > > > 我一直是这样写的,没有用过STDOUT,不知为什么这个程序就不行了。我试着把两个输出之间的语句减少看是否能够输出,答案是可以的(但是是没有任何
> > > > 道理啊。。)
> > > > 中间语句多到一定程度就不能写到文件里(文件始终为空),而我把OUT去掉就一直会持续地在屏幕上有输出。
> > > > 我现在觉得是内存的问题。。。因为中间处理的数据很大。不了解写文件的动作要占用多少内存,似乎是压死骆驼的那最后一根稻草。。
>
> > > > On 11月27日, 下午3时26分, Robin Lee <[email protected]> wrote:
>
> > > > > 应该改成 STDOUT ?
>
> > > > > 2011/11/27 mandova <[email protected]>
>
> > > > > > 改成print也不行,文件打开没有报错,就是死活写不进文件啊~~~把OUT去掉就可以写在屏幕上。。。。- 隐藏被引用文字 -
>
> > > > > - 显示引用的文字 -- 隐藏被引用文字 -
>
> > > - 显示引用的文字 -
>
> > --
> > 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
> > 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
> > 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
> > 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。- 
> > 隐藏被引用文字 -
>
> - 显示引用的文字 -

-- 
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 [email protected]。
要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

回复