Я приведу пример, чтобы сделать его более ясным:
x
: входное изображение формы [2, 3], 1 канал valid_pad
: max pool с ядром 2x2, шагом 2 и VALID. same_pad
: максимальный пул с ядром 2x2, шаг 2 и SAME padding (это классический способ пойти) Формы вывода:
valid_pad
: здесь нет прокладки, поэтому форма вывода [1, 1] same_pad
: здесь , мы вставляем изображение в форму [2, 4] (с помощью -inf
, а затем применяем максимальный пул), поэтому форма вывода [1, 2] x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
x = tf.reshape(x, [1, 2, 3, 1]) # give a shape accepted by tf.nn.max_pool
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
valid_pad.get_shape() == [1, 1, 1, 1] # valid_pad is [5.]
same_pad.get_shape() == [1, 1, 2, 1] # same_pad is [5., 6.]
< ч> Moritz говорит, что это могло бы быть быстрее, чем regex. Даже если это немного медленнее, легче понять в 5:00.:)
#0123456789.123456789.123456789. my $string = "alsdhfaaasccclaaaagalkfgblkgbklfs"; my $pos = 9; my $length = 3; my $regex = qr/^(aaa|bbb|ccc)/; while( $pos < length $string ) { print "Checking $pos\n"; if( substr( $string, $pos, $length ) =~ /$regex/ ) { print "Found $1 at $pos\n"; last; } $pos += $length; }
$string=~/^ # from the start of the string
(?:.{$p0}) # skip (don't capture) "$p0" occurrences of any character
(?:...)*? # skip 3 characters at a time,
# as few times as possible (non-greedy)
(aaa|bbb|ccc) # capture aaa or bbb or ccc as $1
/x;
(Принимающий p0 на основе 0).
Конечно, вероятно, более эффективно использовать substr на строке для пропуска вперед:
substr($string, $p0)=~/^(?:...)*?(aaa|bbb|ccc)/;
Вы не можете действительно рассчитать с regexes, но можно сделать что-то вроде этого:
pos $string = $start_from;
$string =~ m/\G # anchor to previous pos()
((?:...)*?) # capture everything up to the match
(aaa|bbb|ccc)
/xs or die "No match"
my $result = length($1) / 3;
Но я думаю, что это немного быстрее, чтобы использовать substr () и распаковать (), чтобы разделить на тройной и обойти утраивание в для цикла.
(редактирование: это - длина (), не длина () ;-)
Основная часть этого разделяется / (...)/. Но в конце этого, у Вас будут свои положения и данные возникновения.
my @expected_triplets = qw<aaa bbb ccc>;
my $data_string
= 'fjeidoaaaivtrxxcccfznaaauitbbbfzjasdjfncccftjtjqznnjgjaaajeitjgbbblafjan'
;
my $place = 0;
my @triplets = grep { length } split /(...)/, $data_string;
my %occurrence_for = map { $_, [] } @expected_triplets;
foreach my $i ( 0..@triplets ) {
my $triplet = $triplets[$i];
push( @{$occurrence_for{$triplet}}, $i ) if exists $occurrence_for{$triplet};
}
Или для простого подсчета regex (это использует Экспериментальный (?? {}))
my ( $count, %count );
my $data_string
= 'fjeidoaaaivtrxxcccfznaaauitbbbfzjasdjfncccftjtjqznnjgjaaajeitjgbbblafjan'
;
$data_string =~ m/(aaa|bbb|ccc)(??{ $count++; $count{$^N}++ })/g;
Если скорость является серьезным беспокойством, Вы можете, в зависимости от того, каковы 3 строки, становятся действительно необычными путем создания дерева (например, алгоритм Aho-Corasick или подобный).
Карта для каждого возможного состояния возможна, например, состояния [0] = 0, если никакие строки не начинаются с 'a'.