Chinaunix
标题:
求教各位大大们,这个问题用perl怎么处理
[打印本页]
作者:
mingoing
时间:
2014-02-27 09:37
标题:
求教各位大大们,这个问题用perl怎么处理
本帖最后由 mingoing 于 2014-02-27 11:31 编辑
33333.jpg
(36.05 KB, 下载次数: 52)
下载附件
3
2014-02-27 09:23 上传
7400000 8200000 -747.871582
8200000 8500000 -311.464386
8500000 9100000 -552.063538
9100000 9800000 -691.326904
9800000 10700000 -860.887024
10700000 11500000 -775.908630
11500000 12300000 -748.672424
12300000 13200000 -868.078918
13200000 14100000 -844.211609
14100000 14600000 -531.665039
14600000 15500000 -934.396790
15500000 16300000 -808.178162
16300000 17500000 -1163.265747
17500000 17900000 -425.282043
17900000 18900000 -937.942383
18900000 19600000 -743.132019
19600000 20800000 -1200.120850
20800000 21100000 -285.289520
先上图,图中每一行前两个数字相当于左端点右端点,拿第一行来说,相当于在[7400000, 8200000]范围内取值-747.871582。我想得到[8650000,9750000] ,[13250000,13950000],[17650000,18850000]这几个范围内的值。PS:跨范围的取加权平均。{:2_172:}
作者:
q1208c
时间:
2014-02-27 09:39
表示没看懂.
在两个整数区间里, 你想取个 负数 ... ...
作者:
mingoing
时间:
2014-02-27 09:42
相当于分段函数吧,前两个数是分段函数的小段定义域
回复
2#
q1208c
作者:
xiumu2280
时间:
2014-02-27 10:16
本帖最后由 xiumu2280 于 2014-02-27 10:16 编辑
楼主的意思是不是 每一行取个平均值。
然后按照这个平均值,来算[8650000,9750000] ,[13250000,13950000],[17650000,18850000]这几个区域分别的和?
还有不要用图片给原始数据···怎么测试···
作者:
mingoing
时间:
2014-02-27 10:21
本帖最后由 mingoing 于 2014-02-27 10:22 编辑
这种理解也对{:3_189:} ,数据:
7400000 8200000 -747.871582
8200000 8500000 -311.464386
8500000 9100000 -552.063538
9100000 9800000 -691.326904
9800000 10700000 -860.887024
10700000 11500000 -775.908630
11500000 12300000 -748.672424
12300000 13200000 -868.078918
13200000 14100000 -844.211609
14100000 14600000 -531.665039
14600000 15500000 -934.396790
15500000 16300000 -808.178162
16300000 17500000 -1163.265747
17500000 17900000 -425.282043
17900000 18900000 -937.942383
18900000 19600000 -743.132019
19600000 20800000 -1200.120850
20800000 21100000 -285.289520
回复
4#
xiumu2280
作者:
mingoing
时间:
2014-02-27 10:32
比如计算[17650000,18850000]范围内的值:
(17900000-17650000)/(18850000-17650000)*(-425.282043)+(18850000-1790000)/(18850000-17650000)*(-937.942383)
作者:
mingoing
时间:
2014-02-27 10:32
本帖最后由 mingoing 于 2014-02-27 10:46 编辑
比如计算[17650000,18850000]范围内的值:设L=(18850000-17650000),L1=(17900000-17650000),L2=(18850000-1790000),那么最终得到:L1/L*(-425.282043)+L2/L*(-937.942383)
作者:
mingoing
时间:
2014-02-27 17:11
我把程序搞成这样了
open A,"mono_align1\.mlf";
open L,"recout_mon16_phone1\.mlf";
open OUT,">","out.txt";
while (<A>){
chomp;
next if /MLF|lab/;
my ($data1,$data2,$phone1,$score1)=split/\s+/,$_;
print OUT "$_ ";
while (<L>){
chomp;
next if /MLF|rec/;
my ($data3,$data4,$phone2,$score2)=split/\s+/,$_;
if ($data1>$data3&$data2<$data4){
print OUT "$score2\n";
last;
}
if ($data1>$data3&$data2>$data4){
my $nnn=($data4-$data1)/($data2-$data1)*$score2;
print OUT "\"$_\"\n";
&handle($nnn, $data2, $_);
# my ($data4,$data5,$phone3,$score3)=split/\s+/,$_;
# if ($data2<$data5){
# $nnn=$nnn+($data2-$data4)/($data2-$data1)*$score3;
# print OUT "$nnn\n";
last;
# }
}
print OUT "\n";
}
}
sub handle
{
my $nnn = shift;
my $data2 = shift;
my $yyy = shift;
open OOO, ">","22.txt";
my $line = <L>;
chomp($line);
print OOO "$line";
my ($data4,$data5,$phone3,$score3)=split/\s+/,$yyy;
if ($data2<$data5){
$nnn=$nnn+($data2-$data4)/($data2-$data1)*$score3;
return;
}
return;
}
复制代码
作者:
xiumu2280
时间:
2014-02-27 19:52
本帖最后由 xiumu2280 于 2014-02-27 20:05 编辑
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use File::Basename;
my %hash;
while (<DATA>) {
chomp;
my @data = split;
my $aver = $data[2]/($data[1]-$data[0]);
my @da = $data[0]..$data[1];
@hash{@da}= ($aver) x scalar (@da);
}
my @data = ([8650000,9750000],[13250000,13950000],[17650000,18850000]);
foreach my $uniq (@data) {
my $n = 0;
foreach my $cell ($uniq->[0]..$uniq->[1]) {
$n += $hash{$cell};
}
print "$n\n";
}
__DATA__
7400000 8200000 -747.871582
8200000 8500000 -311.464386
8500000 9100000 -552.063538
9100000 9800000 -691.326904
9800000 10700000 -860.887024
10700000 11500000 -775.908630
11500000 12300000 -748.672424
12300000 13200000 -868.078918
13200000 14100000 -844.211609
14100000 14600000 -531.665039
14600000 15500000 -934.396790
15500000 16300000 -808.178162
16300000 17500000 -1163.265747
17500000 17900000 -425.282043
17900000 18900000 -937.942383
18900000 19600000 -743.132019
19600000 20800000 -1200.120850
20800000 21100000 -285.289520
复制代码
这个非常耗内存。运行这点要2G内存··· 如果你都是后面5个0没用的话可以舍去··· 会节省很多内存
-1055.99505195218
-656.60996723752
-1156.84747864572
复制代码
作者:
pitonas
时间:
2014-02-27 20:57
{:2_172:}是不是
[8650000, 9750000] = -634.355527
[13250000, 13950000] = -911.185874
[17650000, 18850000] = -831.1381455
复制代码
#!/usr/bin/perl
my @range = (
[ 8650000, 9750000 ],
[ 13250000, 13950000 ],
[ 17650000, 18850000 ],
);
@range = sort { $a->[0] <=> $b->[0] } @range;
my $index = 0;
my @data = map { [split] } <DATA>;
loop: for my $R (@range) {
my $L = $R->[1] - $R->[0];
my $ave;
for my $i ( $index .. $#data ) {
next if $R->[0] > $data[$i][1];
$index = $i;
my ( $r1, $r2, $v ) = @{ $data[$i] };
$ave += ( $r2 - $R->[0] ) / $L * $v;
for my $j ( $index + 1 .. $#data ) {
my ( $r1, $r2, $v ) = @{ $data[$j] };
$ave += ( $r2 - $r1 ) / $L * $v and next if $R->[1] > $r2;
$ave += ( $R->[1] - $r1 ) / $L * $v;
print "[$R->[0], $R->[1]]\t= $ave\n";
next loop;
}
}
}
__DATA__
7400000 8200000 -747.871582
8200000 8500000 -311.464386
8500000 9100000 -552.063538
9100000 9800000 -691.326904
9800000 10700000 -860.887024
10700000 11500000 -775.908630
11500000 12300000 -748.672424
12300000 13200000 -868.078918
13200000 14100000 -844.211609
14100000 14600000 -531.665039
14600000 15500000 -934.396790
15500000 16300000 -808.178162
16300000 17500000 -1163.265747
17500000 17900000 -425.282043
17900000 18900000 -937.942383
18900000 19600000 -743.132019
19600000 20800000 -1200.120850
20800000 21100000 -285.289520
复制代码
作者:
mingoing
时间:
2014-02-28 09:11
快了,貌似[13250000, 13950000] = -911.185874还有点问题,因为[13250000, 13950000] 是在区间[13200000 14100000]内的,所以直接可以确定为-844.211609。{:2_172:}
回复
10#
pitonas
作者:
mingoing
时间:
2014-02-28 09:16
我研究一下
回复
9#
xiumu2280
作者:
pitonas
时间:
2014-02-28 10:05
{:2_172:} 多谢提醒
[8650000, 9750000] = -634.355527
[13250000, 13950000] = -844.211609
[17650000, 18850000] = -831.1381455
复制代码
#!/usr/bin/perl
my @range = (
[ 8650000, 9750000 ],
[ 13250000, 13950000 ],
[ 17650000, 18850000 ],
);
@range = sort { $a->[0] <=> $b->[0] } @range;
my $index = 0;
my @data = map { [split] } <DATA>;
range: for my $R (@range) {
my $L = $R->[1] - $R->[0];
my $ave;
for my $i ( $index .. $#data ) {
next if $R->[0] > $data[$i][1];
$index = $i;
my ( $r1, $r2, $v ) = @{ $data[$i] };
if ( $R->[1] <= $r2 ) {
print "[$R->[0], $R->[1]]\t= $v\n";
next range;
}
$ave += ( $r2 - $R->[0] ) / $L * $v;
for my $j ( $index + 1 .. $#data ) {
my ( $r1, $r2, $v ) = @{ $data[$j] };
$ave += ( $r2 - $r1 ) / $L * $v and next if $R->[1] > $r2;
$ave += ( $R->[1] - $r1 ) / $L * $v;
print "[$R->[0], $R->[1]]\t= $ave\n";
next range;
}
}
}
__DATA__
7400000 8200000 -747.871582
8200000 8500000 -311.464386
8500000 9100000 -552.063538
9100000 9800000 -691.326904
9800000 10700000 -860.887024
10700000 11500000 -775.908630
11500000 12300000 -748.672424
12300000 13200000 -868.078918
13200000 14100000 -844.211609
14100000 14600000 -531.665039
14600000 15500000 -934.396790
15500000 16300000 -808.178162
16300000 17500000 -1163.265747
17500000 17900000 -425.282043
17900000 18900000 -937.942383
18900000 19600000 -743.132019
19600000 20800000 -1200.120850
20800000 21100000 -285.289520
复制代码
回复
11#
mingoing
作者:
mingoing
时间:
2014-02-28 11:05
哥们太赞了,学习了{:2_172:}
回复
13#
pitonas
作者:
kernel69
时间:
2014-02-28 20:29
来个想要求出结果的栗子
回复
1#
mingoing
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2