Здесь начинающий программист. Я' m написать программу, которая анализирует относительное пространственное расположение точек (ячеек). Программа получает границы и тип ячейки из массива с координатой x в столбце 1, координатой y в столбце 2 и типом ячейки в столбце 3. Затем она проверяет каждую ячейку на предмет типа ячейки и соответствующего расстояния от границ. Если он проходит, он затем вычисляет свое расстояние от каждой другой ячейки в массиве, и если расстояние находится в пределах указанного диапазона анализа, он добавляет его в выходной массив на этом расстоянии.
Моя программа маркировки ячеек находится в wxpython, поэтому я был в надежде разработать эту программу также на Python и в конечном итоге вставить ее в графический интерфейс. К сожалению, сейчас python требуется ~ 20 секунд для запуска основного цикла на моей машине, в то время как MATLAB может выполнять ~ 15 циклов в секунду. Так как я' м планируя выполнить 1000 циклов (с условием рандомизированного сравнения) в ~ 30 случаях, умноженных на несколько типов исследовательского анализа, это нетривиальная разница.
Я пробовал запустить профилировщик, и вызовы массивов выполняются в 1/4 случаев, почти все остальное - это неопределенное время цикла.
Вот код python для основного цикла:
for basecell in range (0, cellnumber-1):
if firstcelltype == np.array((cellrecord[basecell,2])):
xloc=np.array((cellrecord[basecell,0]))
yloc=np.array((cellrecord[basecell,1]))
xedgedist=(xbound-xloc)
yedgedist=(ybound-yloc)
if xloc>excludedist and xedgedist>excludedist and yloc>excludedist and yedgedist>excludedist:
for comparecell in range (0, cellnumber-1):
if secondcelltype==np.array((cellrecord[comparecell,2])):
xcomploc=np.array((cellrecord[comparecell,0]))
ycomploc=np.array((cellrecord[comparecell,1]))
dist=math.sqrt((xcomploc-xloc)**2+(ycomploc-yloc)**2)
dist=round(dist)
if dist>=1 and dist<=analysisdist:
arraytarget=round(dist*analysisdist/intervalnumber)
addone=np.array((spatialraw[arraytarget-1]))
addone=addone+1
targetcell=arraytarget-1
np.put(spatialraw,[targetcell,targetcell],addone)
Вот код matlab для основного цикла:
for basecell = 1:cellnumber;
if firstcelltype==cellrecord(basecell,3);
xloc=cellrecord(basecell,1);
yloc=cellrecord(basecell,2);
xedgedist=(xbound-xloc);
yedgedist=(ybound-yloc);
if (xloc>excludedist) && (yloc>excludedist) && (xedgedist>excludedist) && (yedgedist>excludedist);
for comparecell = 1:cellnumber;
if secondcelltype==cellrecord(comparecell,3);
xcomploc=cellrecord(comparecell,1);
ycomploc=cellrecord(comparecell,2);
dist=sqrt((xcomploc-xloc)^2+(ycomploc-yloc)^2);
if (dist>=1) && (dist<=100.4999);
arraytarget=round(dist*analysisdist/intervalnumber);
spatialsum(1,arraytarget)=spatialsum(1,arraytarget)+1;
end
end
end
end
end
end
Спасибо!