2012-03-20 274 views
3

我有一组存储在文本文件中的矩阵。我想计算一个由输入矩阵的元素平均值得出的输出矩阵。的图示在下面给出:从矩阵计算元素平均值

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。 欢迎您提出任何建议!

回答

3
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

我建议在两个阶段做到这一点。首先,将矩阵转换为(行号,列号,值)三行的行。为了简单起见,我将假设没有行和列标签的矩阵。

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变量矩阵数通过。您可以改为从三元组中选择。