配列から最大数を取得する

配列から最大数を取得する

2×2の配列を含むファイルがあります。

データ

1: 6.1703
541.631 46.0391

2: 6.1930
537.446 45.9239

3: 6.1931
177.171 288.579

4: 6.1939
167.171 298.579

5: 8.2281
 533.686 53.7245

6: 8.6437
519.219 65.0547

7: 9.0823
484.191 95.0753

8: 9.3884
 237.75 240.082

9: 9.4701
 167.525 246.234

10: 9.7268
 411.929 70.7877

各行列の位置(1,2)の値を見て、6.1937に近く、要素(2,1)の値が大きい場合は選択する必要があります。この例では、選択した値は6.1930でなければなりません。 (この部分は解決しました。選択比較基準に従って配列要素数を記録する方法)

次に、各行列の(2,2)位置で最も高い値を選択し、対応する(1,2)要素を印刷する必要があります。この場合、選択した値は6.1939です。 (この部分はスクリプトの変更が必要です。)

同様の問題に対する以前の解決策がありました。

解決策

#!/usr/bin/perl
use warnings;
use strict;

my $close_to = 6.1937;

my ($close, $lowest);

$/ = q();
while (<>) {
    my @arr = split;
    if ((! defined $close || abs($arr[1] - $close_to) < abs($close - $close_to))
        && $arr[2] > $arr[3]
        ) {
        $close = $arr[1];
    }
    if ((! defined $lowest || $arr[1] < $lowest)
        && $arr[2] < $arr[3]
        ) {
        $lowest = $arr[1];
    }
    if (eof) {
        print "$close $lowest\n";
        undef $close;
        undef $lowest;
    }
}

スクリプトのこの部分を変更する必要があるようですが、どうすればよいかわかりません。

if ((! defined $lowest || $arr[1] < $lowest)
       && $arr[2] < $arr[3]
        ) {
       $lowest = $arr[1];
}

データの出力は次のようになります。

6.1930  6.1939

ベストアンサー1

このコード部分を実際に変更する必要があります。問題は、2つの値、つまりこれまでに見つかった最も高い値と対応する(1,2)要素を保存する必要があることです。

#!/usr/bin/perl
use warnings;
use strict;

my $close_to = 6.1937;

my ($close, $highest, $corr_highest);

$/ = q();
while (<>) {
    my @arr = split;
    if ((! defined $close || abs($arr[1] - $close_to) < abs($close - $close_to))
        && $arr[2] > $arr[3]
        ) {
        $close = $arr[1];
    }
    if (! defined $highest || $arr[3] > $highest) {
        ($highest, $corr_highest) = @arr[3, 1];

    }
    if (eof) {
        print "$close $corr_highest\n";
        undef $_ for $close, $highest, $corr_highest;
    }
}

おすすめ記事