А вот и программа без циклов. При сколько-нибудь длинных файлах выигрыш очень заметный. Предполагается, что точность e_ps мала по сравнению с минимальным шагом по времени в одном файле min(diff(fil_1(:,1)))
% Choose rows with the same time in 2 n-column matrixes
function [ch_row,fr_1,fr_2]=ch_row(fil_1,fil_2,e_ps)
% looks for close times in two files and for them
% ch_row=[fil_1,fil_2];
s_1=size(fil_1);
L_1=s_1(1,1);
w_1=s_1(1,2)-1;
s_2=size(fil_2);
L_2=s_2(1,1);
w_2=s_2(1,2)-1;
w_t=w_1+w_2;
v_1=[1:L_1]'; % row number in the initial file #1
v_2=[1:L_2]'; % row number in the initial file #2
b_1=[fil_1(:,1),ones(L_1,1),v_1]; % 2-nd column - file number
b_2=[fil_2(:,1),ones(L_2,1)*2,v_2];
b_t=[b_1;b_2]; % join files
b_ts=sortrows(b_t,1); % sort along the 1-st (time) column
f_eq=find(diff(b_ts(:,1))<=e_ps); % look for approximately equal times
L_eq=length(f_eq);
b_r=[b_ts(f_eq,,b_ts(f_eq+1,2:3)]; % form an array with file and row numbers for equal times
f_dir=find(b_r(:,2)==1 & b_r(:,4)==2); % times with t_1<t_2
f_inv=find(b_r(:,2)==2 & b_r(:,4)==1); % times with t_2<t_1
ch_row=[b_r(:,1),zeros(L_eq,w_t)]; % blank for the output array
v_eq_11=b_r(f_dir,3); % row numbers in fil_1 for t_1<t_2
v_eq_12=b_r(f_dir,5); % row numbers in fil_2 for t_1<t_2
v_eq_21=b_r(f_inv,5); % row numbers in fil_2 for t_2<t_1
v_eq_22=b_r(f_inv,3); % row numbers in fil_1 for t_2<t_1
ch_row(f_dir,2:w_1+1)=fil_1(v_eq_11,2:w_1+1); % fill the blank for t_1<t_2
ch_row(f_dir,w_1+2:w_t+1)=fil_2(v_eq_12,2:w_2+1);
ch_row(f_inv,2:w_1+1)=fil_1(v_eq_21,2:w_1+1); fill the blank for t_2<t_1
ch_row(f_inv,w_1+2:w_t+1)=fil_2(v_eq_22,2:w_2+1);
fr_10=[v_eq_11;v_eq_22];
fr_1=sort(fr_10); % row numbers in fil_1
fr_20=[v_eq_12;v_eq_21];
fr_2=sort(fr_20); % row numbers in fil_1
end
________________
© n_y 2007.06.05.