如何快速在矩阵中分段求取最小值并生成新的矩阵
mathcad吧
全部回复
仅看楼主
level 5
wang龙天光军
楼主
随便举例一个矩阵如下:
任务是根据M矩阵第一列的数值给矩阵分段,然后根据矩阵第三列的数值求第三列在每段最小值所对应的第二列的数值是多少。
本人见识浅薄,实在想不出怎么求比较快速有效,之想到一个笨办法,提供给大家当作进一步了解我需要的解题思路及结果:
这种形式的结果是我需要的,但是过程太复杂,如果M矩阵是个1600行长度的矩阵,这种方法显然不可行的。望吧友们不吝赐教!多谢!
2017年02月28日 05点02分
1
level 15
月城翁
您的上一个帖子
https://tieba.baidu.com/p/4953946212?pn=2
的最后结果您看了没有?完全用MC15,不用MP3。 一直不见您回帖,我怕耽误您的工作,特别在此问一下。
您今天的问题要简单得多。但是,您所举的例子,最后并没有提取第2列的数据。不知最后到底需要什么结果?
2017年02月28日 05点02分
2
wang龙天光军
多谢提醒,我后来没有看了,太多工作要做了,我还以为上次用mp解答完就没有后续了呢。非常感谢。这里有第二列的的数据啊,结果中第二列就是对应的数据,由于还需要后续的其他的处理,所以还必须的保留第一列跟三列的最小值,总之我真正要求的东西比较麻烦,目前我急需要所举列子中的快速解答方法
2017年02月28日 05点02分
level 15
月城翁
2017年02月28日 11点02分
4
level 15
月城翁
2017年02月28日 14点02分
5
wang龙天光军
多谢!看起来这么简单的程序,我却琢磨了很久才看懂您的思路,MC小白级别,得快快成长起来!
2017年02月28日 16点02分
月城翁
没什么神秘的,多临摹、多动手,经历的多了,自然就熟练了。
2017年02月28日 16点02分
level 15
月城翁
把向量B的算法修改了一下,从理论上讲,应该稍快一点。如果矩阵M有行数很多,应能看到用时差异。
2017年02月28日 16点02分
6
level 15
月城翁
把矩阵C和M的初始值用NAN处理,这恐怕是定稿了:
2017年02月28日 16点02分
7
月城翁
笔误:NaN
2017年02月28日 16点02分
月城翁
因为您在实际运用时矩阵的行数很多,所以我在尽量找可以减少耗时的地方。
2017年02月28日 16点02分
月城翁
如果把程序板中的用1行2列的矩阵赋值方式分开成2行分别赋值的语句,还会快一点儿。
2017年02月28日 16点02分
level 15
月城翁
2017年02月28日 17点02分
8
月城翁
这组算式在for循环中多次被调用,所以不能小觑耗时。
2017年02月28日 17点02分
level 15
月城翁
还有一个问题。
如果矩阵M的第1列是浮点小数,那么,就不能使用逻辑等号判定两个浮点数是否相等,而要改用数值误差范围不超过事先规定的的误差值ε来判定。
2017年03月01日 00点03分
9
level 15
月城翁
for循环k的终值为零的递减,要比k的终值为rw-1的递增 ,耗时要少。
2017年03月01日 00点03分
10
level 15
月城翁
还有一个bug,当某一组只有1行值时也要考虑到。
2017年03月01日 01点03分
11
wang龙天光军
多谢您考虑的这么周到,虽然我目前的数据不会出现后面假设的这些情况,但是对以后的运算还是很受用的,在您这里学习了不少东西,已把之前还有现在学到的东西整理到了笔记本上
2017年03月01日 04点03分
wang龙天光军
但是我在运行过程中遇到了另外一个问题,match()这块总出问题,我这里不可能有重复的数,所以最小值肯定只有一个,但是结果总给出一大堆匹配行数
2017年03月01日 04点03分
level 5
wang龙天光军
楼主
关于match出现的问题,我只截取一小部分作为事例
实际操作中向量有1600行,它给出匹配的位置有几百多个,可是一一对照过去他们并不相等,最小值只有一个的,这是什么情况
2017年03月01日 04点03分
12
wang龙天光军
难道这就是前面您在9楼说的浮点小数?可是我这是具体实数啊
2017年03月01日 04点03分
level 15
月城翁
注意:match()的右括号下面有个数字下标0
match()会把所有它认为匹配的值组成一个向量(1列多行的矩阵),我们取其第一项,即向量的第0行。
通常,MC把有小数的数值都列入浮点小数的范畴。整数、(浮点)小数都是实数。由于计算机是二进制的,对于非整数,相当多的不能精确计算和存储,尤其是超长的小数,只能近似计算和存储。所以,不能用逻辑等号(精确相等),只能规定不超过某一误差就算相等。
2017年03月01日 05点03分
13
level 5
wang龙天光军
楼主
比如我把M矩阵的最后一列换成极小的数字,如下
那么用上面的方法算出来的结果就是不
正确的
我最后做了如下改动,敬请赐教
2017年03月01日 05点03分
14
wang龙天光军
我在设定ε值的时候无论如果改变它的级数都无法得到正确的结果
2017年03月01日 05点03分
level 15
月城翁
在程序板之前加上TOL:=10^-6
2017年03月01日 05点03分
15
wang龙天光军
果然可以了,不用在程序板中加入ε的定义也可行。又了解了一个功能。
2017年03月01日 05点03分
月城翁
程序板中的ε与矩阵M的第0列的值的比较有关,与第2 列的match()无关。
2017年03月01日 05点03分
level 15
月城翁
按理,csort()比min()耗时。因为您的数据较多,再小的耗时累积起来都不小。您可以比较使用两个函数的耗时情况。
在程序板板块的前面加上:t0:=time(0) ,这里括号中的0是虚拟值,随便填入一个值都可以。
在程序板板块的后面加上:t1:=time(0)
然后就可以计算出耗时(秒):T:=t1-t0=
2017年03月01日 05点03分
16
1
2
尾页