首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对两个数组中的每个变量组合执行一个函数

对两个数组中的每个变量组合执行一个函数
EN

Stack Overflow用户
提问于 2014-10-02 19:19:15
回答 3查看 84关注 0票数 0

我试图取一组数据,然后用另一组数据减去该数据中的每个值。

例如:

代码语言:javascript
运行
复制
Data set one (1, 2, 3)
Data set two (1, 2, 3, 4, 5)

所以我应该得到一些东西,比如(1 - (1 .. 5))(2 - (1..5)),等等。

我目前有:

代码语言:javascript
运行
复制
#!/usr/bin/perl
use strict;
use warnings;

my $inputfile = $ARGV[0];

open( INPUTFILE, "<", $inputfile ) or die $!;

my @array = <INPUTFILE>;

my $protein = 'PROT';
my $chain   = 'P';
my $protein_coords;

for ( my $line = 0; $line <= $#array; ++$line ) {
    if ( $array[$line] =~ m/\s+$protein\s+/ ) {
        chomp $array[$line];
        my @splitline = ( split /\s+/, $array[$line] );
        my %coordinates = (
            x => $splitline[5],
            y => $splitline[6],
            z => $splitline[7],
        );
        push @{ $protein_coords->[0] }, \%coordinates;
    }
}

print "$protein_coords->[0]->[0]->{'z'} \n";

my $lipid1 = 'MEM1';
my $lipid2 = 'MEM2';
my $lipid_coords;

for ( my $line = 0; $line <= $#array; ++$line ) {
    if ( $array[$line] =~ m/\s+$lipid1\s+/ || $array[$line] =~ m/\s+$lipid2\s+/ ) {
        chomp $array[$line];
        my @splitline = ( split /\s+/, $array[$line] );
        my %coordinates = (
            x => $splitline[5],
            y => $splitline[6],
            z => $splitline[7],
        );
        push @{ $lipid_coords->[1] }, \%coordinates;
    }
}

print "$lipid_coords->[1]->[0]->{'z'} \n";

我试图取$protein_coords->[0]->[$ticker]->{'z'}中的每个值减去$lipid_coords->[1]->[$ticker]->{'z'}中的每个值。

我的总体目标是在方程(z2-z1)^2中找到d = sqrt((x2-x1)^2+(y2-y1)^2-(z2-z1)^2)。我认为,如果我能做到一次,那么我也可以做X和Y。从技术上讲,我试图找出PDB文件中每个原子与同一个PDB中每个脂质原子之间的距离,并打印距离小于5A的ResID。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-02 19:44:25

最简单的方法是在浏览第二个文件时进行计算:

代码语言:javascript
运行
复制
for (my $line = 0; $line <= $#array; ++$line) {
    if (($array[$line] =~ m/\s+$lipid1\s+/) | ($array[$line] =~ m/\s+$lipid2\s+/)) {  
        chomp $array[$line];
        my @splitline = (split /\s+/, $array[$line]);
        my %coordinates = (x => $splitline[5],
                           y => $splitline[6],
                           z => $splitline[7],
                          );
        push @{$lipid_coords->[1]}, \%coordinates;

        # go through each of the sets of protein coors in your array...
        for my $p (@{$protein_coords->[0]}) {
            # you can store this value however you want...
            my $difference = $protein_coords->[0][$p]{z} - $coordinates{z};
        }
    }
}

如果我是您,我将使用某种形式的唯一标识符来允许我访问每个组合上的数据--例如,构建表单$difference->{<protein_id>}{<lipid_id>} = <difference>的散列。

票数 0
EN

Stack Overflow用户

发布于 2014-10-02 19:38:57

要迭代两个数组的所有组合,只需嵌入两个for循环:

代码语言:javascript
运行
复制
use strict;
use warnings;

my @dataone = (1, 2, 3);
my @datatwo = (1, 2, 3, 4, 5);

for my $one (@dataone) {
    for my $two (@datatwo) {
        print "$one - $two\n";
    }
}

产出:

代码语言:javascript
运行
复制
1 - 1
1 - 2
1 - 3
1 - 4
1 - 5
2 - 1
2 - 2
2 - 3
2 - 4
2 - 5
3 - 1
3 - 2
3 - 3
3 - 4
3 - 5
票数 3
EN

Stack Overflow用户

发布于 2014-10-02 19:53:40

这将给出从集合1的每个元素中减去集合2的每一个元素的结果,我相信这是你所要求的方式。

代码语言:javascript
运行
复制
#!/usr/bin/perl

use strict;
use warnings;

my @set1 = (1, 2, 3);
my @set2 = (1, 2, 3, 4, 5);

my @set3 = ();
for my $val (@set1) {
    push @set3, map { $val - $_ } @set2;
}

local $" = ', ';
print "@set3\n";

system 'pause';

结果将是一个包含(1 -(1.5),2-(1.5),3- (1..5))的数组。

脚本运行后@set3 3的内容:

代码语言:javascript
运行
复制
0, -1, -2, -3, -4, 1, 0, -1, -2, -3, 2, 1, 0, -1, -2

所有其他的蛋白质和脂肪的东西都在我头上,但我希望这至少能帮上一点忙。现在应该有一个数组,其中包含可以使用的减法元素,以获得其余的结果!

编辑:

可以用以下一个衬垫替换循环:)

代码语言:javascript
运行
复制
my @set3 = map { my $v = $_; map { $v - $_ } @set2 } @set1;

地图是一个非常漂亮的功能!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26168007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档