Chinaunix首页 | 论坛 | 博客
  • 博客访问: 422041
  • 博文数量: 97
  • 博客积分: 3145
  • 博客等级: 中校
  • 技术积分: 1890
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-15 12:52
文章分类
文章存档

2020年(1)

2016年(8)

2015年(3)

2014年(1)

2013年(5)

2012年(4)

2011年(9)

2010年(12)

2009年(42)

2008年(12)

我的朋友

分类: LINUX

2015-07-30 16:08:07

需求:
   有2个文件,文件中是2个相同的矩阵,比如:
file1:
    2 3 4
    2 3 4
    2 3 4
file2:
    1 1 2
    1 1 3
    1 1 4
需要的结果是输出:
     3 4 6
     3 4 7
     3 4 8
方法一:
分析:
  从结果看,这个题目要求的是将2个矩阵相加,对应的位置都要相加,这个问题实现的方法很多,这里我们通常的做法是将2个文件对应的位置的值取出来,再相加,如果用二维数组实现很简单,开始想的很简单,仔细一想,发现实现起来其实也是很简单,主要实现方法:
  1.先将2个文件内容按照行的方式读取到数组,使用awk的多文件处理的NR/FNR来进行转换
  2.在将对应的位置内容分别读取出来,进行加法运算,将运算结果打印出来

实现的shell:

#!/bin/sh
      #author by bbzsxjj
      #定义2个文件
      file1=file1
      file2=file2

   awk '{if(NR==FNR){a[FNR]=$0};if(NR!=FNR){b[FNR]=$0}}
   END{for(i=1;i<=length(a);i++){
   split(a[i],c," ");split(b[i],d," ");
   e="";for(j=1;j<=length(c);j++){e=e" "(c[j]+d[j])}
   ;print e
   }
   }' $file1 $file2
说明:
      split(a[i],c," ");split(b[i],d," "); 将每行的数进行切割,转换为数组,便于后续的处理
      此脚本适用于 2个一样规格的矩阵相加,不适用于行列不对称的矩阵运算
 


  方法二:
   不使用awk编程,直接使用shell脚本编程,先从第一个个文件中去1行,再从第二个文件取1行,再将每行的相应列进行相加,最后打印出来。
#!/bin/sh
        file1=file1
        file2=file2
        linenum=1
        while read line 
        do
             a1=(`echo $line`)
             a2=(`sed -n ''${linenum}'p' $file2`)

             linenum=$((linenum+1))

             b=""
             for((i=0;i<${#a1[*]};i++))
                 do
                         b=$b" "$((a1[$i]+a2[$i]))
                 done
             echo $b
        done<$file1



方法三:
使用python写这个脚本:

#!/usr/bin/env python
file1='1.txt'
file2='2.txt'
fp1=open(file1,'r')
fp2=open(file2,'r')
def create_matrix(fp):
    matrix=[]
    for line in fp: 
        mx=line.split()
        matrix.append(mx)
    return matrix
def matrix_add(mx1,mx2):
    matrix=[]
    for i in range(len(mx1)):
        ma=[]
        for j in range(len(mx1)):
            k=int(mx1[i][j])+int(mx2[i][j])
            ma.append(k)
        matrix.append(ma)
    return matrix
matrix1=create_matrix(fp1)
matrix2=create_matrix(fp2)
print matrix1
print matrix2
matrix3=matrix_add(matrix1,matrix2)
print matrix3

方法四:
先造一个同样的二维数组存放结果,代码将会更简洁:
#!/usr/bin/env python
file1='1.txt'
file2='2.txt'
fp1=open(file1,'r')
fp2=open(file2,'r')
def create_matrix(fp):
    matrix=[]
    for line in fp: 
        mx=line.split()
        matrix.append(mx)
    return matrix
def matrix_add(mx1,mx2,mx3):
    for i in range(len(mx1)):
        for j in range(len(mx1)):
            mx3[i][j]=int(mx1[i][j])+int(mx2[i][j])
    return mx3 
matrix1=create_matrix(fp1)
matrix2=create_matrix(fp2)
matrix3=matrix2
print matrix1
print matrix2
matrix=matrix_add(matrix1,matrix2,matrix3)
print matrix






阅读(1060) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~