Si el trabajo consiste en leer todas las matrices, y sacar las medias de uno o varios puntos, es algo que se hace fácil en Perl.
Consiste en pasar las matrices a estructuras de arrays de arrays, en Perl, y luego, para cada punto del que queremos información, sacamos la media (sumamos todos los puntos de las mismas coordenadas y lo dividimos por el número de matrices).
El detalle al que hay que prestar atención en un problema así es al de no confundir líneas con columnas.
Por ejemplo:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.14;
use autodie;
my @puntos = ( # fila, columna, comenzando en 1 (no en 0)
[ 11, 7 ],
[ 3, 17 ],
[ 5, 10 ],
[ 1, 1 ],
);
#open my $SALIDA, '>', 'output.txt';
my @matriz_de_matrices;
my @archivos = <*.lst>;
for my $archivo (@archivos) {
open my $LST, '<', $archivo;
while (<$LST>) {
if (my $res = /SPECIES: NO2\s+LAYER/ .. /^\s+1\s+2/) {
# $res indica qué línea de la matriz estamos leyendo
if ($res == 1) { # primera línea de la matriz
push @matriz_de_matrices, []; # creamos espacio para guardarla
}
#elsif ($res =~ /E0$/) { # última línea
#}
else { # resto de líneas
if (/^\s+(\d+) I (.+)$/) { # si la línea comienza con un índice de fila
my $y = $1; # guardamos el índica
my $fila = $2;
my @columnas = split " ", $fila;
#print $SALIDA "$y | @columnas\n";
$matriz_de_matrices[-1][$y] = [ 0, @columnas ];
}
}
}
}
close $LST;
}
#close $SALIDA;
#use Data::Dumper::Perltidy;
#print Dumper \@matriz_de_matrices;
say "Número de matrices: ", scalar @matriz_de_matrices;
for my $punto_ref (@puntos) {
my($fila, $columna) = @$punto_ref;
my $suma = 0;
for my $matriz_ref (@matriz_de_matrices) {
$suma += $matriz_ref->[$fila]->[$columna]; # sumamos elementos en la misma pos. para todas las matrices
}
my $media = $suma / @matriz_de_matrices;
say "Media del punto [$fila][$columna] = $media";
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
La salida es:
Using text Syntax Highlighting
Número de matrices: 10
Media del punto [11][7] = 0.9
Media del punto [3][17] = 7.7
Media del punto [5][10] = 1.5
Media del punto [1][1] = 9.2
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Aquí, vamos leyendo las matrices, por líneas. Cuando detectamos la primera línea de una matriz, creamos un nuevo elemento en el array que las almacenará todas (push()). Si es una línea normal, sacamos todas las columnas, y la guardamos en el índice de fila correspondiente.
La línea 41 quiere decir: "guarda en la posición $y de la anterior matriz (-1), la nueva fila que te voy a dar, que es un '0', seguido de todas las @columnas que he encontrado".
Lo del '0' quizás no se entienda al principio. Los arrays, en Perl, comienzan siempre en '0', pero veo que las matrices que vas a manejar usan índices de filas y columnas basadas en '1'. Por eso, "metemos" una columna más, delante de las demás, para que cuando busquemos una determinada coordenada, como seguramente estará basada en 1, localizará la columna correcta. La fila también será la correcta porque estamos usando los índices que hay en el propio archivo. Suponemos que nunca nos mandarán calcular puntos de la primera columna o de la primera fila.