免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1673 | 回复: 6
打印 上一主题 下一主题

[数值计算] 高手帮看下这个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-12 09:36 |只看该作者 |倒序浏览
本帖最后由 dahaoshanhe 于 2012-09-12 09:42 编辑

有两个文件,
第一个文件如下,有三列,第一列为x坐标,第2列为y坐标,第3列为高程,用z表示.
文件2也有三列,第一列为x坐标,第2列为y坐标,第3列为待求高程.
利用文件1与文件2中的xy坐标得到文件2中的第3列,
规则为:如果文件2中的xy与文件1中的xy距离最近,也就是两点间距离最小
则把文件1中的第3列z的值赋给文件2中.
两点间距离公式:   distance=sqrt(x1-x2)^2+(y1-y2)^2
  1. 文件1
  2. x y   z
  3. 1 2   34
  4. 3 5   56
  5. 6 7   20
  6. 9 4   17

  7. 文件2
  8. x y    z
  9. 1 3
  10. 2 4  
  11. 6 6


  12. 输出结果:
  13. x y    z
  14. 1 3    34
  15. 2 4    56
  16. 6 6    20
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2012-09-12 10:08 |只看该作者
回复 1# dahaoshanhe
  1. awk 'NR==FNR{a[$1" "$2]=$3;next}{d=-1;for(i in a){split(i,t);td=(t[1]-$1)^2+(t[2]-$2)^2;if(td<d||d<0){$3=a[i];d=td}}}1' file1.txt file2.txt
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-09-12 10:32 |只看该作者
感谢黑哥 高手  佩服~~~谢啦   研读下你的思路~

论坛徽章:
0
4 [报告]
发表于 2012-09-12 10:38 |只看该作者
回复 2# blackold


    td=(t[1]-$1)^2+(t[2]-$2)^2;if(td<d||d<0)  这个没有看太明白  ,怎么没有用到sqrt这个呢?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2012-09-12 11:13 |只看该作者
回复 4# dahaoshanhe


    没有必要。

    a>b  等价于 sqrt(a) > sqrt(b)

论坛徽章:
0
6 [报告]
发表于 2012-09-12 12:20 |只看该作者
#!/bin/sh

x1=(`awk '{print $1}' file1`)
y1=(`awk '{print $2}' file1`)
z1=(`awk '{print $3}' file1`)

x2=(`awk '{print $1}' file2`)
y2=(`awk '{print $2}' file2`)

mindist=9999.999
echo x y z

for ((i=0;i<${#x2[*]};i=i+1))
do
        for ((j=0;j< ${#x1[*]};j=j+1))
        do
                x=$[${x2[$i]} - ${x1[$j]}]
                y=$[${y2[$i]} - ${y1[$j]}]
                z=$(expr "scale=3;sqrt ($[$x**2 + $y**2])"|bc)
                [[ $z > $mindist ]]   || z2=${z1[$j]}
                [[ $z > $mindist ]]   || mindist=$z
        done
        mindist=9999.999
        echo ${x2[$i]} ${y2[$i]} $z2
done

论坛徽章:
0
7 [报告]
发表于 2012-09-12 13:38 |只看该作者
回复 2# blackold

厉害,awk确实强大


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP