вычисление поэлементных средних из матриц - PullRequest
3 голосов
/ 20 марта 2012

У меня есть набор матриц, хранящихся в текстовых файлах.Я хотел бы вычислить выходную матрицу, полученную из поэлементных средних входных матриц.Ниже приводится иллюстрация:

cat file1.txt
Item0 Item1
Item0 1.01456e+06 5
Item1 2 12.2


cat file2.txt
Item0 Item1
Item0 1.0274e+06 6
Item1 0 14.5


cat output.txt
Item0 Item1
Item0 1020980 5.5
Item1 1 13.35

Обратите внимание, что некоторые значения во входных матрицах находятся в engineering notation.Все предложения приветствуются!

Ответы [ 2 ]

3 голосов
/ 20 марта 2012
awk -v row=2:3 -v col=2:3 -v num=2 '

BEGIN {
    split(row, r, ":")
    split(col, c, ":")
    n = num
}

r[1]<=FNR && FNR<=r[2] {
    for(i=c[1];i<=c[2];i++)
    {
        m[FNR,i]+=$i
    }
}

END {
    for(i=r[1];i<=r[2];i++)
    {
        for(j=c[1];j<=c[2];j++)
        {
            printf("%f\t", m[i,j]/n)
        }
        print ""
    }
}' file{1,2}.txt

1020980.000000  5.500000
1.000000        13.350000
2 голосов
/ 20 марта 2012

Я бы предложил сделать это в два этапа. Сначала преобразуйте матрицы в строки троек (номер строки, номер столбца, значение). Для простоты я буду использовать матрицы без меток строк и столбцов.

for f in file*.txt
do
  awk '{ for (n=1; n<=NF; n++) { print NR, n, $n } }' $f
done

Этот первый шаг объединяет все матрицы таким способом, который легче обрабатывается.

Затем вычислите средние значения, добавив тройки в awk:

awk -v Rows=2 -v Cols=2 Mats=2 '
{
  sum[$1, $2] += $3
}

END {
  for (m=1; m<=Rows; m++) {
    for (n=1; n<=Cols; n++) {
      printf("%s ", sum[m, n])
    }
    printf("\n")
  }
}'

Для простоты я просто передал числа строк, столбцов и матриц в качестве переменных awk. Вы могли бы вместо этого определить те из троек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...