с первыми двумя - проблем нет.
переменные создаются заранее и в процессе их размер не менятеся.
а вот с этим.
Цитата:
обилие циклов - постарайтесь использовать работу с массивами вместо циклов везде, где это возможно
как-то пока не сростается
а в частности
код
===========================================
data1=double(data1);
[X,Y]=meshgrid(1:1:size(data1,1),1:1:size(data1,2));
for k=1:z;
sh_x=vect(1)*k-1;
sh_y=vect(2)*k-1;
i=ceil(shift_x-sh_x);
j=ceil(shift_y-sh_y);
di=abs(i-(shift_x-sh_x));
dj=abs(j-(shift_y-sh_y));
[XI,YI]=meshgrid(1+di:1:size(data1,1),1+dj:1:size(data1,2));
[si,sj]=size(XI);
ZI = interp2(X,Y,data1(:,:,20),XI,YI);
int_data(i:i+si-1,j:j+sj-1) = int_data(i:i+si-1,j:j+sj-1) + double(ZI);
end
===========================================
работает в три раза медленнее кода
============================================
data1=double(data1);
for k=1:z;
sh_x=vect(1)*k;
sh_y=vect(2)*k;
for i=1:size(int_data,1);
ii=i+sh_x-shift_x;
if (ii>=2 & ii<=x-1);
iir=round(i+sh_x-shift_x);
iif=floor(i+sh_x-shift_x);
iic=ceil(i+sh_x-shift_x);
for j=1:size(int_data,2);
jj=j+sh_y-shift_y;
if (jj>=2 & jj<=y-1);
jjr=round(j+sh_y-shift_y);
jjf=floor(j+sh_y-shift_y);
jjc=ceil(j+sh_y-shift_y);
ad_x1y1=data1(iif,jjf,k);
ad_x1y2=data1(iif,jjc,k);
ad_x2y1=data1(iic,jjf,k);
ad_x2y2=data1(iic,jjc,k);
ad_y1=ad_x1y1+(ii-iif)*(ad_x1y2-ad_x1y1);
ad_y2=ad_x2y1+(ii-iif)*(ad_x2y2-ad_x2y1);
ad=ad_y1+(jj-jjf)*(ad_y2-ad_y1);
int_data(i,j) = int_data(i,j)+ ad;
%int_data(i,1+ceil(shift_y-sh_y):(ceil(shift_y-sh_y)+size(ad,2))) = int_data(i,1+ceil(shift_y-sh_y):(ceil(shift_y-sh_y)+size(ad,2)))+ double(ad);
end
end
end
end
%[num2str(k),' cycles out of ',num2str(z),' is done']
end
=======================
хотя первый использует всего один цикл и две стандартные функции
а второй делает поэлементный перебор массива и использует для этого 3 вложенных цикла.
где собака порылась?