免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 1233 | 回复: 10

[数值计算] 从数组中取最接近已知数的元素 [复制链接]

论坛徽章:
0
发表于 2019-06-04 13:59 |显示全部楼层
请教各路大神:
set a = ( 37  39.1 39.2 41 )
set b = 38.3
如何通过脚本在 a数组中取得与b最接近的值呢?(最好帮忙用shell脚本)

论坛徽章:
0
发表于 2019-06-05 00:10 |显示全部楼层
回复 1# 21002700

1

论坛徽章:
0
发表于 2019-06-05 00:11 |显示全部楼层
  1. #!/usr/bin/awk -f
  2. #

  3. BEGIN{
  4.   a="37 39.1 39.2 41"
  5.   b=38.3

  6.   split(a,c," ")
  7.   for(i in c)
  8.     b>c[i]?d[b-c[i]]=c[i]:d[c[i]-b]=c[i]

  9.   PROCINFO["sorted_in"]="@ind_num_asc"
  10.   for(i in d){
  11.     print d[i]
  12.     exit
  13.   }
  14. }

  15. ./test.awk
  16. 39.1
复制代码

论坛徽章:
0
发表于 2019-06-05 12:45 |显示全部楼层
  1. $数组 = 1..1000
  2. $要找的值 = 333.5

  3. do
  4. {
  5.         $步长 = $步长 + 0.1
  6.         $小值 = $要找的值 - $步长
  7.         $大值 = $要找的值 + $步长
  8.         $找到的结果 = $数组 | Where-Object { $_ -ge $小值 -and $_ -le $大值 }
  9.         $i++
  10. }
  11. while ($找到的结果.count -lt 1)
  12. write-host "共找了 $i 次,结果是 $找到的结果"
复制代码


返回:
共找了 5 次, 333 334

win,linux 通用,powershell代码。


=================================
问:powershell啥时候开源(+免费)的?
答:
2015年小范围内部开源,2016年开发者大会上,正式法律开源。



问:开源后的powershell,属于谁的财产?
答:
在遵守其开源协议的前提下。powershell开源后。属于【社区财产】或【任何人财产】。



问:谁是powershell开源免费的最大受益者?
答:
powershell可以运行在,win,mac,ubuntu1404+,centos7,debian8+,suse12+,arch,alpine linux,树莓派Raspbian,win10-iot,docker,snap-app,open-wrt路由器等。
这些系统使用者,是powershell开源免费的最大受益者。



问:powershell完全开源了么?
答:
不完全是。
1 powershell之所以简单、强大、好用。靠的是powershell5.1+win自带的powershell库。我们应该主要使用这些库。
这些库,并没有开源。开源之前,是否免费我也不清楚。
2 powershell6,powershell7,和相关的库,开源了。
这里面的区别主要是【win自带软件,相关的powershell库】。
库数量很多,如iis的ps库。但这些win独有软件的ps库,跨不了平台。即便开源给liux也并没啥用。
另外一些win,linux通用的ps库,比如sqlserver的powershell库,已经开源免费放在了github和powershell画廊。

结论:
1开源时间太短,社区力量不强。ps开源库还没成气候。
2win中的老旧不开源ps库挺好用。这些库中有价值的正在逐渐开源+跨平台。

论坛徽章:
0
发表于 2019-06-05 12:53 |显示全部楼层
  1. #!/usr/bin/awk -f
  2. #

  3. BEGIN{
  4.   a="37 39.1 39.2 41"
  5.   b=38.3
  6.   split(a,c," ")
  7.   
  8.   for(i in c)
  9.     b>c[i]?d[b-c[i]]=c[i]:d[c[i]-b]=c[i]

  10.   PROCINFO["sorted_in"]="@ind_num_asc"
  11.   for(i in d){
  12.     print d[i]
  13.     exit
  14.   }
  15. }
复制代码

论坛徽章:
5
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:40
发表于 2019-06-05 13:01 |显示全部楼层
  1. #!/usr/bin/python3
  2. a = [37,39.1, 39.2, 41]
  3. b = 38

  4. d = [abs(i-b) for i in a]
  5. res= [a[i] for i,k in enumerate(d) if k==min(d)]
  6. for i in res:
  7.     print(i)
复制代码

论坛徽章:
0
发表于 2019-06-05 17:46 |显示全部楼层
本题讲解:
这道题的解题道理,跟民工筛沙子类似。
1 先用 步长=0.1 粗筛。直到 筛出3个结果。
2 用步长2 = 步长 / 10 细筛。直到筛出2个结果。
3 判断这2个结果,看大值 - 中间数  中间数 - 小值的结果是否一致,不一致的话,还可以返回小的。
也就是说2个结果,有可能还能筛,最终剩1个。有可能像我的例子那样不能筛掉。

论坛徽章:
0
发表于 2019-06-12 14:14 |显示全部楼层
感谢各位大神的热情指导,谢谢

论坛徽章:
0
发表于 2019-06-12 16:27 |显示全部楼层
回复 6# cfwyy

cfwyy
大概感觉原理是找到数组与给定值的最小差异,再找到对应的数组中的值,res= [a for i,k in enumerate(d) if k==min(d)]
这一段能具体讲解一下吗,小弟平时只会写cshell,


论坛徽章:
5
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:40
发表于 2019-06-13 09:03 |显示全部楼层
本帖最后由 cfwyy 于 2019-06-13 09:08 编辑

回复 9# 21002700
python 入门简单的,找本教材看几天就了解了。
首先 数组在python里可以简单的用列表来代替了(其实python里也有数组,和列表不完全一样的)
d是差值的绝对值组成的列表。

  1. res= [a[i] for i,k in enumerate(d) if k==min(d)]
复制代码

和前面生成的d一样,是列表推导式生成的一个列表。
其中enumerate()函数是python内建函数,参数是可迭代对象,利用它可以同时获得索引和对应的值,它返回的是一个enumerate对象,如果把这个对象用list()生成一个列表的话,这个列表就形如:[(0,value1),(1,value2),(2,value3)...],enumerate对象在for循环里可以直接用来迭代不需要事先生成列表。
所以  当d中的值为最小值时,i是其对应的索引,也是原来数组a中的索引,res就是满足条件的所有元素组成的列表。最后迭代打印出来即可。其实很简单,可能解释的不是很清楚,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

ITPUB技术栈

ITPUB技术栈是ITPUB企业打造的垂直于IT领域的知识社群平台,在这里,你既可以是创作者也可以是消费者。如果你的IT生涯丰富多彩,喷薄的个人价值尽可在小栈内体现;如果你渴望找到志同道合的伙伴,拓宽人脉,小栈比跑会场更快。 小栈特色:
1.极高的用户转化率,实现更直接的知识变现;
2.随时随地,刷个朋友圈的时间,实现更长效的信息沉淀;
3.戳痛、难点的专业咨询,更接近成功解决方案的时刻;
4.贴近意见领袖,个人高速成长,迈入更富有价值的人际圈。

----------------------------------------

技术小栈>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP