Мне удалось векторизовать внутренний цикл следующим образом ...
lengthData=1500;
data=rand(lengthData,1);
result=zeros(floor(lengthData/2),lengthData);
for i=1:floor(lengthData/2)-1
del = 2*i+1;
ind_arr = [];
ind_arr(:,1) = 1:lengthData+1-del;
ind_arr(:,2:del) = 1;
ind_arr = cumsum(ind_arr,2);
data_arr = data(ind_arr);
[~,max_ind] = max(data_arr,[],2);
result(i,1+i:length(data)-i) = max_ind==(i+1);
end
Возможно, есть более чистый способ сборки ind_arr
, но, похоже, он дает результаты, соответствующие вашему исходному коду.
Запуск его через профилировщик в R2014b показывает
time calls line
1 1 lengthData=1500;
1 2 data=rand(lengthData,1);
1 3 result=zeros(floor(lengthData/2),lengthData);
1 4 result2 = result;
5
1 6 t1ID = tic;
7
1 8 for i=1:floor(lengthData/2)-1
749 9 for j=1+i:length(data)-i
3.66 561750 10 if(data(j)==max(data(j-i:j+i)))
< 0.01 4276 11 result(i,j)=1;
4276 12 end
0.70 561750 13 end
749 14 end
15
1 16 fprintf('Original Time: %g\n',toc(t1ID));
17
1 18 t2ID = tic;
19
1 20 for i=1:floor(lengthData/2)-1
21
749 22 del = 2*i+1;
0.02 749 23 ind_arr = [];
< 0.01 749 24 ind_arr(:,1) = 1:lengthData+1-del;
0.45 749 25 ind_arr(:,2:del) = 1;
0.51 749 26 ind_arr = cumsum(ind_arr,2);
27
1.42 749 28 data_arr = data(ind_arr);
29
0.52 749 30 [~,max_ind] = max(data_arr,[],2);
31
0.05 749 32 result2(i,1+i:length(data)-i) = max_ind==(i+1);
33
749 34 end
35
1 36 fprintf('Single Loop Time: %g\n',toc(t2ID));
Original Time: 4.53376
Single Loop Time: 2.81267