免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5150 | 回复: 13
打印 上一主题 下一主题

数值计算 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-08 23:48 |只看该作者 |倒序浏览
各位亲,现在有一个计算平均值的问题,有一个数组
比如这个@orig=(1,2,3,3,2,1,3,3,3),想计算这个数组中每三个元素的平均值,结果输出到@end,即结果应该为@end=(2,2,3)

而我现在有一个49950个元素的数组
@num=(20,30,30....)
这个数组里有49950个元素,现在想从前往后依次计算下每999个元素的平均值,这样就会产生50个平均值,然后输出到@mean数组中,不知道该怎么做比较好。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-09-09 10:01 |只看该作者
定义一个求数组平均的子函数,每读到一个元素push到新的数组,知道999为止

论坛徽章:
0
3 [报告]
发表于 2014-09-09 10:09 |只看该作者
回复 2# huang6894

怎么能每999个元素求一次平均呢
   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
4 [报告]
发表于 2014-09-09 10:24 |只看该作者
本帖最后由 huang6894 于 2014-09-09 10:24 编辑

回复 3# codeternity

一个最笨的解决方法
  1. #!/usr/bin/perl -w
  2. @orig=(2,2,3,3,2,1,3,3,3);
  3. sub mean(){
  4.         my @all = @_;
  5.         my $num = scalar @all;
  6.         my $total = 0;
  7.         for my $i (@all){
  8.                 $total += $i if defined $i;
  9.         }
  10.         my $mean  = $total/$num;
  11.         return $mean;
  12. }
  13. my $n = 3;
  14. while($n <= ($#orig + 1)){
  15.         my @tem;
  16.         for ($i=$n-3;$i<=$n-1;$i++){
  17.                 push @tem,$orig[$i];
  18.         }
  19.         my $result = &mean(@tem);
  20.         $n += 3;
  21.         print $result;
  22. }
复制代码

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
5 [报告]
发表于 2014-09-09 10:38 |只看该作者
zhe yang xing bu xing{:3_193:}
  1. #!perl
  2. use strict;
  3. use List::Util qw{ sum };

  4. my @num=(20,30,30....);

  5. my $head = 0;
  6. my $tail = 0;
  7. my @mean = ();

  8. while (1) {
  9.     $tail = $head + 998;
  10.     $tail = $#num if $tail >= $#num;

  11.     my @slice = @num[$head .. $tail];
  12.     push @mean, (sum @slice) / ($#slice + 1);

  13.     $head = $tail + 1;
  14.     last if $tail == $#num;
  15. }

  16. __END__
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-09-09 11:16 |只看该作者
本帖最后由 afukada 于 2014-09-09 11:17 编辑
  1. @mean=map{eval(join("+,",@num[(50*$_)..(50*$_+998)]))/999}(0..49)
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
7 [报告]
发表于 2014-09-09 12:40 |只看该作者
只能用 shift, 否则会 OOM 的. 你的数组太大了.

论坛徽章:
0
8
发表于 2014-09-09 16:20
回复 4# huang6894
大侠,这个结果是不是有太对呢……

   

论坛徽章:
0
9
发表于 2014-09-09 16:20
回复 5# stanley_tam
这样子是可以的,多谢了,学习了……

   

论坛徽章:
0
10 [报告]
发表于 2014-09-09 16:21 |只看该作者
回复 6# afukada
哦!!!又是一行代码,佩服!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP