提高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个小时,根本无法接受~
请问还能提高运算效率吗?
要如何改呢?
...全文
2918 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)

7,762

社区成员

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

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