【发布时间】:2023-03-03 03:40:01
【问题描述】:
我的数据如下所示:
my @homopol = (
["T","C","CC","G"], # part1
["T","TT","C","G","A"], #part2
["C","CCC","G"], #part3 ...upto part K=~50
);
my @prob = ([1.00,0.63,0.002,1.00,0.83],
[0.72,0.03,1.00, 0.85,1.00],
[1.00,0.97,0.02]);
# Note also that the dimension of @homopol is always exactly the same with @prob.
# Although number of elements can differ from 'part' to 'part'.
我想做的是
- 生成
part1到partK中的所有元素组合 - 找到
@prob中对应元素的乘积。
因此最后我们希望得到这个输出:
T-T-C 1 x 0.72 x 1 = 0.720
T-T-CCC 1 x 0.72 x 0.97 = 0.698
T-T-G 1 x 0.72 x 0.02 = 0.014
...
G-G-G 1 x 0.85 x 0.02 = 0.017
G-A-C 1 x 1 x 1 = 1.000
G-A-CCC 1 x 1 x 0.97 = 0.970
G-A-G 1 x 1 x 0.02 = 0.020
问题是我的以下代码是通过硬编码实现的
循环。由于@homopol 的零件数量可以变化很大
(例如~K=50),我们需要一种灵活紧凑的方式来获得相同的结果。有没有?
我正在考虑使用Algorithm::Loops,但不知道如何实现。
use strict;
use Data::Dumper;
use Carp;
my @homopol = (["T","C","CC","G"],
["T","TT","C","G","A"],
["C","CCC","G"]);
my @prob = ([1.00,0.63,0.002,1.00,0.83],
[0.72,0.03,1.00, 0.85,1.00],
[1.00,0.97,0.02]);
my $i_of_part1 = -1;
foreach my $base_part1 ( @{ $homopol[0] } ) {
$i_of_part1++;
my $probpart1 = $prob[0]->[$i_of_part1];
my $i_of_part2 =-1;
foreach my $base_part2 ( @{ $homopol[1] } ) {
$i_of_part2++;
my $probpart2 = $prob[1]->[$i_of_part2];
my $i_of_part3 = -1;
foreach my $base_part3 ( @{ $homopol[2] } ) {
$i_of_part3++;
my $probpart3 = $prob[2]->[$i_of_part3];
my $nstr = $base_part1."".$base_part2."".$base_part3;
my $prob_prod = sprintf("%.3f",$probpart1 * $probpart2 *$probpart3);
print "$base_part1-$base_part2-$base_part3 \t";
print "$probpart1 x $probpart2 x $probpart3 = $prob_prod\n";
}
}
}
【问题讨论】:
-
嗯,没有什么比早上 DNA 编码的味道更香了。 :)
标签: perl algorithm nested-loops