2012-03-20 198 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變量矩陣數通過。您可以改爲從三元組中選擇。