提高VB运行速度

Tsunami87 2009-05-15 05:20:10
加精
下面是我的代码:
Dim temrecord2(360, 1) As Long
Dim i, j, k, l, f As Integer
Dim count As Integer
Dim cx, cy, csx, csy As Long
Dim jl As Single

For l = 0 To 360
For i = 0 To 360
If i - l < 0 Then
temrecord(i, 0) = record(i - l + 360, 0)
Else
temrecord(i, 0) = record(i - l, 0)
End If
temrecord(i, 1) = 1
Next

For f = 0 To 360
For j = 0 To 360
csx = Int((basicrecord(f, 0) * Cos(f * pi180) - temrecord(j, 0) * Cos(j * pi180)))
csy = Int((basicrecord(f, 0) * Sin(f * pi180) - temrecord(j, 0) * Sin(j * pi180)))
count = 0

For k = 0 To 360
cangle = (k + 90) * pi180
cx = (temrecord(k, 0)) * Sin(cangle) + csx
cy = (temrecord(k, 0)) * Cos(cangle) + csy

jl = Sqr((cx - temrecord2(1, 0)) ^ 2 + (cy - temrecord2(1, 1)) ^ 2)
If jl > Val(Text7.Text) Then
count = count + 1
End If
If count > 180 Then Exit For
Next
DoEvents
Next
Next
Next

就这些运算,要完成就需要差不多20个小时,根本无法接受~
请问还能提高运算效率吗?
要如何改呢?
...全文
2921 162 打赏 收藏 转发到动态 举报
写回复
用AI写文章
162 条回复
切换为时间正序
请发表友善的回复…
发表回复
youyebing 2012-10-19
  • 打赏
  • 举报
回复
在这里刚看了2天,真的学到了很多。
Seneal 2012-09-21
  • 打赏
  • 举报
回复
建议处理成矢量图.......算匹配效率就非常高......
oshi002 2011-10-15
  • 打赏
  • 举报
回复
对俺来说还是太深一些这个。
gis20073119 2009-10-12
  • 打赏
  • 举报
回复
好贴学习学习。。
btxdlibin 2009-05-21
  • 打赏
  • 举报
回复
分析下LZ的代码.

1.变量定义不标准.定义太多变体.很多人都看出来了

2.顶楼的Val(Text7.Text) 这个应该用变量代替.

3.重复计算.这是你代码运行效率最大的问题.
((basicrecord(f, 0) * Cos(f * pi180) 和((basicrecord(f, 0) * Sin(f * pi180)
这个跟f循环有关的要放f循环中去.

sxx = (temrecord(k, 0) / maxv / 10) * (rad) * Sin(cangle) + pw + csx / maxv / 10 * rad
'X=maxv/10*rad :sxx = (temrecord(k, 0) / X * Sin(cangle) + pw + csx /X
tangle = Int((Atn(csy / csx) + 2 * 3.1415926) / 3.1415926 * 180)
'不断计算3.1415926 * 180这些常数,完全可以换成两个常数X,Y => tangle = Int((Atn(csy / csx) /X + Y)

4.如X楼所说幂运算X^2最好换成乘法运算X*X

5.DoEvents太频繁,可能的话放更外层循环.这个占用了一部分时间

6.多步(行)计算写到一行的 (重复计算的部分还是要放到外面)


Tsunami87 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 140 楼 kingswonder 的回复:]
引用 133 楼 Tsunami87 的回复:
怎么去找特征点啊?两个图形,可能任意对应点差的很远~


圆心或中心点知道吧
周围360个点,最远点和最近点都是唯一的吧,这就有两个参考点了。
先找出这两个极点,然后就可以得出这两点的夹角。
如果这两图的的夹角大致相等,就算有可能相似,否则就先排除了。
然后分别比较这两点前后点的位置(当然是比较到原点的距离,就是矢量)
如果也接近,就说明图形细节大致相似,
然后…
[/Quote]

找最远点和最近点!关键是这些点都是不确定的,很可能就变化了的,两幅图的图像是大体相同,细节极大可能不同,可能所有点都差不多
Tsunami87 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 104 楼 Tiger_Zhao 的回复:]
只是平移和旋转哪需要这么复杂。


VB code任意取图形 B 的1条边 b1
For Each ai IN 图形A的每条边()
'按边的长度直接淘汰一部分'
If ai.Length <> b1.Length Then Goto NextEdge

计算 b1 要与 ai 重合 B 平移后的新圆心 c 和旋转角度 r'有两对 {c1,r1} 和 {c2,r2}'

For Each bj IN 图形B的每条边() '除b1外'
按照 {c1,r1} 求 bj 的新坐标 bj1
If bj1 与 a(i+j) 不重合 Then Got…
[/Quote]

用了对边的比较的方法,果然很快,循环少了两层
Woodman007 2009-05-21
  • 打赏
  • 举报
回复
我在 153 楼的推导错了,更正如下:

y = f(x0, y0, θ)
=Σ(i=1,n)( (Δx_i)^2 + (Δy_i )^2 )
=Σ(i=1,n)( (x_i * cosθ + y_i * sinθ - x0 -X_i)^2 + (y_i * cosθ - x_i * sinθ - y0 - Y_i)^2 )
=Σ(i=1,n)( x_i^2 + y_i^2 + x0^2 + y0^2 + X_i^2 + Y_i^2 + 2 * x0 * X_i + 2 * y0 * Y_i - 2 * x_i * x0 * cosθ - 2 * y_i * x0 * sinθ - 2 * y_i * y0 * cosθ + 2 * x_i * y0 * sinθ - 2 * x_i * X_i * cosθ - 2 * y_i * X_i * sinθ - 2 * y_i * Y_i * cosθ + 2 * x_i * Y_i * sinθ )

= ……

然后求导:

dy/dx0 = …… = 0

dy/dy0 = …… = 0

dy/dθ = …… = 0

再把

sinθ = 2*t/(1+t^2)

cosθ=(1-t^2)/(1+t^2)

代回,化成未知量是 x0,y0,t 的三个三元三次方程组,可能没有数学解析解,要通过数值方法求解。
kong佳 2009-05-20
  • 打赏
  • 举报
回复
还是没搞明白
C_Temujen 2009-05-20
  • 打赏
  • 举报
回复
学习了!
Woodman007 2009-05-20
  • 打赏
  • 举报
回复
LZ 的问题可以转化为下面的问题

已知:

2N 个点:

(x1,y1),(x2,y2),……(x_n,y_n)

(X1,Y1),(X2,Y2),……(X_n,Y_n)

其中 (X_i,Y_i) 是 (x_i,y_i) 经过平移和旋转之后再加上一点误差得到的,求最佳的坐标变换。

根据坐标变换公式:

X_i = x_i * cosθ + y_i * sinθ - x0 + Δx_i
Y_i = y_i * cosθ - x_i * sinθ - y0 + Δy_i

(x0,y0) 是坐标平移参数,θ是坐标旋转参数,Δx_i、Δy_i 是误差。

为了可以利用微分学的理论,“最佳坐标变换”的标准,用“误差的平方和最小”为标准,类似最小二乘法:

y = f(x0, y0, θ)
=Σ(i=1,n)( (X_i-x_i)^2 + (Y_i-y_i)^2 )
=Σ(i=1,n)( (x_i * cosθ + y_i * sinθ - x0 -x_i)^2 + (y_i * cosθ - x_i * sinθ - y0 - y_i)^2 )
=Σ(i=1,n)( 2*x_i^2 - 2*x_i^2*cosθ + 2*y_i^2 - 2*y_i^2*cosθ + x0^2 + y0^2 + 2*x0*x_i - 2*x0*x_i*cosθ + 2*y0*y_i - 2*y0*y_i*sinθ -2*x0*y_i*sinθ + 2*y0*x_i*sinθ )
=n*x0^2 + n*y0^2 + 2*x_sum*x0 + 2*y_sum*y0 - 2*(x_2sum+y_2sum)*cosθ - 2*x_sum*x0*cosθ - 2*y_sum*x0*sinθ + 2*(x_sum-y_sum)*y0*sinθ + 2*x_2sum + 2*y_2sum

其中 x_2sum =Σ(i=1,n)x_i^2,y_2sum =Σ(i=1,n)y_i^2,x_sum =Σ(i=1,n)x_i,y_sum =Σ(i=1,n)y_i

根据“可导函数的极值在其一阶导数为 0 处”:

dy/dx0 = 2*n*x0 + 2*x_sum - 2*x_sum*cosθ - 2*y_sum*sinθ = 0

dy/dy0 = 2*n*y0 + 2*y_sum + 2*(x_sum-y_sum)*sinθ = 0

dy/dθ= 2*(x_2sum+y_2sum)*sinθ + 2*x_sum*x0*sinθ- 2*y_sum*x0*cosθ + 2*(x_sum-y_sum)*y0*cosθ = 0

解以上三个式子组成的方程组,就可以得到最佳坐标变换

设:

t = tan(θ/2),则

sinθ = 2*t/(1+t^2)

cosθ=(1-t^2)/(1+t^2)

代回原式,就可以化去三角函数,把原式变成有理式。

式子太复杂了,我没精力运算下去了,请 LZ 自己计算吧。这个方法最难就在解方程组。一旦把方程组的解算出来,就可以根据解的式子来编程,运算可以在毫秒的时间内完成。
算出 x0,y0,θ后,再一一验证每个点的误差,如果误差超出范围(距离大于某个值)的点超出一个数(比如全部点数的 1/5),可以判定两幅图不相似。算参数和验证的时间也是在毫秒级。
hbqingfeng 2009-05-20
  • 打赏
  • 举报
回复
精简一下
having_hr 2009-05-20
  • 打赏
  • 举报
回复
VB拿来做图像处理太勉强了。。。
嗷嗷叫的老马 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 136 楼 zzhgb 的回复:]
引用 131 楼 myjian 的回复:
引用 39 楼 Chen8013 的回复:
我常用的智能陈桥。
要进行特殊的输入时,切换到王码五笔或全拼就可以了,它有软键盘,在上面点鼠标右键......

哈哈.

智能陈桥是很不错的.........你双击一下右Shift键看看出来啥了?

另外,晃来凑个热闹........算法我直接晕倒爬过............


多按了几次右shift,崩溃,输入法不能用,鼠标滚轮不能用,
注销....
老马害人
[/Quote]
不至于吧................双击右SHIFT,就会弹出智能陈桥的特殊符号输入界面,一个软件键盘......再单击SHIFT就能取消.....

你啥版本的?我是这个版本:

http://www.m5home.com/1/
egceo 2009-05-19
  • 打赏
  • 举报
回复
20个小时?晕!!!
lijiawlm 2009-05-19
  • 打赏
  • 举报
回复
头晕
huangshuojch 2009-05-19
  • 打赏
  • 举报
回复
VB的程序性并不是很好,主要用于事务处理,一般如果有这么大的计算量,就不用VB了
VICTOR051867 2009-05-19
  • 打赏
  • 举报
回复
循环相当多!!!
kingswonder 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 133 楼 Tsunami87 的回复:]
怎么去找特征点啊?两个图形,可能任意对应点差的很远~
[/Quote]

圆心或中心点知道吧
周围360个点,最远点和最近点都是唯一的吧,这就有两个参考点了。
先找出这两个极点,然后就可以得出这两点的夹角。
如果这两图的的夹角大致相等,就算有可能相似,否则就先排除了。
然后分别比较这两点前后点的位置(当然是比较到原点的距离,就是矢量)
如果也接近,就说明图形细节大致相似,
然后根据两个极点的直角坐标,就可以知道某一图形的相对旋转角度了。
然后再随机抽样比较几个点,如果符合,就通过,不符合(概率很小)就重新选点或排除。

即使两图形大小不一致都能比较,可以算出缩放的比例。
实际就是角度和半径。
(半径就不要开平方了,角度也别求了,直接比对弦长的平方,或相互比例,
大量使用勾股定理,pi都不必用,浮点也不用,全整数运算,理论上似乎也可)

应该一秒内能解决。最多千余次运算吧。
僵哥 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 129 楼 kingswonder 的回复:]
好像某国外权威说过,以为integer比long快是误区,因为VB实际用long来存储integer,也就是说实际上没有integer这种类型。
所以理论上long和integer大致效率是相等的。
节省地使用integer没有效果,因为微软偷偷地否定了这种美德。
[/Quote]
理论上来讲与机器字长相等的整数类型的运算效率是最优的.
加载更多回复(141)
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了易用的一键式设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。在常规修复过程中,程序还会自动检测DirectX加速状态,在异常时给予用户相应提示。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V4.0版分为标准版、增强版以及在线修复版。所有版本都支持修复DirectX的功能,而增强版则额外支持修复c++的功能。在线修复版功能与标准版相同,但其所需的数据包需要在修复时自动下载。各个版本之间,主程序完全相同,只是其配套使用的数据包不同。因此,标准版和在线修复版可以通过补全扩展包的形式成为增强版。本程序自V3.5版起,自带扩展功能。只要在主界面的“工具”菜单下打开“选项”对话框,找到“扩展”标签,点击其中的“开始扩展”按钮即可。扩展过程需要Internet连接,扩展成功后新的数据包可自动生效。扩展用时根据网络速度不同而不同,最快仅需数秒,最慢需要数分钟,烦请耐心等待。如扩展失败,可点击“扩展”界面左上角小锁图标切换为加密连接,即可很大程度上避免因防火墙或其他原因导致的连接失败。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有更新系统c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。除常规修复外,新版程序还支持C++强力修复功能。当常规修复无效时,可以到本程序的选项界面内开启强力修复功能,可大幅提高修复成功率。请注意,请仅在常规修复无效时再使用此功能。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 新版程序支持命令行运行模式。在命令行中调用本程序,可以在路径后直接添加命令进行相应的设置。常见的命令有7类,分别是设置语言的命令、设置窗口模式的命令,设置安全级别的命令、开启强力修复的命令、设置c++修复模式的命令、控制Direct加速的命令、显示版权信息的命令。具体命令名称可以通过“/help”或“/?”进行查询。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了7项高级功能。点击"常规”选项卡可以调整程序的基本运行情况,包括日志记录、安全级别控制、调试模式开启等。只有开启调试模式后才能在C++修复失败时显示详细错误信息,并提示用户进行手动修复。在“高级”选项卡中,可以控制C++的修复模式,默认为智能模式,即当程序检测到系统中C++存在问题时提示修复,否则不提示。强制检测模式下,程序将总是检查C++的情况,即使在C++已经正常或没有C++数据包时。默认不勾选模式与智能模式基本相同,只是修复C++的箭头默认处于不勾选状态,需要用户手动勾选后才会进行修复。不提示异常模式,只对标准版或在线修复版生效,即在常规检测后不再提示可能导致0xc000007b错误的C++异常。不检测模式,不再检测C++的状态,程序将只进行DirectX的检测与修复。C++强力修复功能,通过全新的代码设计,彻底改善对于顽固异常文件的处理,极大提高修复成功率。API Sets强力修复功能,参照了DirectX文件的精细修复方式,极大地改善了修复失败的情况。请仅在正常修复无效时再启用这两项强力修复功能。在“注册”选项卡中,程序可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“扩展”选项卡可以将任意版本的程序扩展成增强版。点击“DirectX版本”选项卡,可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。如果显卡驱动异常(包括显卡驱动未安装或显卡驱动太旧),程序会在该页面右上角进行提示。在“实验室”选项卡中,用户可以控制是否允许更新为最新的测试版程序,以及在更新后的数据包更新策略。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序内置自动更新程序,用户只需在“关于”对话框中点击相应按钮,即可自动升级至最新版本。升级后会自动根据用户指定的更新策略更新C++数据包。如果因网络原因或服务器异常导致升级失败,用户也可以前往本程序官方博客手动下载最新版程序。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7、Windows 8、Windows 10及后续用户,可以直接运行本程序。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧