0

Nx3 配列からサイズ 3x3 のブロックを抽出したいと考えています。

    foreach (@TotalData){
         print "@{$_}\n";
    }

(例として)私に与えます:

    .
    .
    0.000 22.00 3.791140e+000
    0.100 22.00 2.737532e+000
    0.200 22.00 2.393466e+000
    .
    .

ドットは他のエントリを表します。この 3x3 ブロックを独自の配列に配置したいと考えています。どうすればこれを抽出できますか?

4

3 に答える 3

2

ブロックで何をしたいですか?@TotalDataのスライスが必要な場合(例:@TotalData[4,5,6]またはsplice(@TotalData, 4, 3))、一度に3つループしたい場合(例:with List::MoreUtils::natatime); あなたは本当に言うのに十分な情報を与えていません。

副作用として@TotalDataをクリアしてもかまわない場合:

while ( my @block = splice( @TotalData, 0, 3 ) ) {
    # do something with @block (which will have 3 elements,
    # except on the last iteration, where it will have 1-3)
}

3の完全なブロックのみを取得するには。

while ( 3 == ( my @block = splice( @TotalData, 0, 3 ) ) ) {
    # do something with @block (which will have 3 elements)
}
于 2013-03-17T05:34:50.493 に答える
1

PDLにはこれを行うためのメソッドがあると確信しています。実際、これとほとんど同じ問題が、PDL ドキュメントのコンウェイのライフ ゲームの例で調査されています。

于 2013-03-17T22:00:18.717 に答える
1

Are you looking for List::MoreUtils::natatime?

#!/usr/bin/env perl

use strict;
use warnings;

use List::MoreUtils qw( natatime );

my @data = (
    [1 .. 3],
    [4 .. 6],
    [7 .. 9],
    ['a' .. 'c'],
    ['d' .. 'f'],
    ['g' .. 'i'],
);

my $it = natatime(3, @data);

while (my @set = $it->()) {
    for my $r ( @set ) {
        print "@$r\n";
    }
    print '-' x 30, "\n";
}

Output:

~/tmp> ./jj.pl
1 2 3
4 5 6
7 8 9
------------------------------
a b c
d e f
g h i
------------------------------
于 2013-03-17T22:34:15.683 に答える