前两天跑了一个最短路径,在找出需要搜索的点那放了两个循环,因此大约2分钟或者一分半出一张361*361的图,其实搜索的范围就这个图的一半,我当时觉得已经算是在降低运行时间了,但是由于跑的实在太慢,而我毕设的数据量又很大,因此再进行改进。
是想着把那两个循环去掉,其实那两个循环的目的很简单就是找到distance数组里最小的且没有被搜索过的数,因此用了数组运算,将符合条件的像元都存在一个数组中,不符合条件的令为999,然后在起始的时候定义一个min=999,这样在后来得到最小值时,就可以直接比较了。刚开始不知道有ARRAY_INDICES这个函数可以识别多维数组的位置。所以当时只撤销了一个循环,改用min()函数,时间变为30s出一张图,后来再把另一循环删掉用ARRAY_INDICES,最后运行20s,我觉得在IDL中能用矩阵运算的一定要用啊,用不了用where,或者它自己自带的函数,会快很多。要减少自己写循环的次数。
修改后的一段代码如下:
;找出最小且没有搜索过的点
minnumber=999.0
mini=-1
minj=-1
right=mask
right[*,*]=(search eq 0 and s ge index and mask eq 1)*1 ;这里是找出符合条件的像元
distemp=pdis
distemp[*,*]=distemp*(right eq 1)+999*(right eq 0)
minvalue=min(distemp,location)
if minvalue lt minnumber then begin
ind = ARRAY_INDICES(distemp, location)
minnumber=minvalue
mini=ind[0]
minj=ind[1]
endif