Compair two vectors with different length and different values??

16 次查看(过去 30 天)
Hallo
Lets say i have two vectors A, B with different length (Length(A) not equal to Length(B)) and the Values in Vector A, are not the same as in Vector B. i want to compair each value of B with Values of A (Compair means if Value B(i) is alomst the same value of A(1:end) for example B(i)-Tolerance<A(i)<B(i)+Tolerance.
How Can i do this without using For loop as the data are huge?
I know ismember, intersect,repmat,find but non of those function can really help me
  2 个评论
Jos (10584)
Jos (10584) 2013-7-12
Huge is relative ... How would you do this using a for-loop? It might be easy to improve upon that.
What is it exactly you want to know. Your wordings suggest that you only want to see if an element of B is close one (or more) elements of A, while your formula suggests that you want it the other way around ...
Aubai
Aubai 2013-7-12
编辑:Aubai 2013-7-12
So i have a wt Values (on Y-axie) of one signal with Sampling frequency of F1, B Matris is 594301*1 double and the second matrix is also a wt Values (on Y-axie) with Sampling frequency of F2, A Matris is 713164*1 double. there is a time shift between the two wt function that i would like to calculate. for that i am trying to find the equality values of B Matrix with A Matrix (Like resample) and then getting the index of those A values equale to the B values in order to get the X- axie corresponding values (time) and finaly calcualte the time difference. with for i did it as the following:
A = Angle_Measured_OMERCON;
B = TTy;
RESULTS = [];
for i = 1: length(A)
for j = 1:length(B)
if A(i) == B(j)
Results(i,j) = i;
elseif B(j)-1 < A(i) < B(j)+1
Results(i,j) = i;
end
end
end
end

请先登录,再进行评论。

采纳的回答

Jan
Jan 2013-7-12
This is a job for Bruno's FEX: ismemberf.
  5 个评论
Jan
Jan 2013-7-13
The help section of ismemberf is actually clear.
A = 0:0.1:1
B = 0.32
[tf, loc] = ismemberf(B, A, 'tol', 0.02) % "tol", not "tot"!
Now tf is true, because B is found inside a, and loc is 4, because it is found at the 4th element of A.
Aubai
Aubai 2013-7-16
Thx for the support: It seems this is how i can do it
if true
A_diff_2 = diff(A,2);
B_diff_2 = diff(B,2);
A_diff_max = max(A_diff_2);
B_diff_max = max(B_diff_2);
Zero_Crossing_Points_A = find(A_diff_2 >= 178);
First_Point_of_calculation_A = Zero_Crossing_Points_A(1);
Zero_Crossing_Points_B = find(B_diff_2 >= 359);
First_Point_of_calculation_B = Zero_Crossing_Points_B(2);
i = 1;
Delta_final_time = [];
Delta_final_Angle = [];
time_Final = [];
%------------------------ Try ------------------------------
while i<=length(Zero_Crossing_Points_B)
if i == 1395
haha = 2;
end
if i == 1
A_cut = A(i:Zero_Crossing_Points_A(i));
A_time_cut = A_time(i:Zero_Crossing_Points_A(i));
B_cut = B(i:Zero_Crossing_Points_B(i));
B_time_cut = B_time(i:Zero_Crossing_Points_B(i));
[tf, loc] = ismemberf(B_cut, A_cut, 'tol', 1);
if tf ~= 1
error('Worrning','One of the CAN values was not recognized by OMERCON values')
else
Delta = B_time_cut - A_time_cut(loc);
Delta_time = mean([A_time_cut(loc) B_time_cut]');
Delta_final_time = [Delta_final_time,Delta];
Delta_final_Angle = [((Delta*360)/0.02) ,Delta_final_Angle];
time_Final = [time_Final,Delta_time'];
%tryy(i,1:length(Delta_final_Angle)) = Delta_final_Angle(1:end);
end
else
A_cut = A(Zero_Crossing_Points_A(i-1):Zero_Crossing_Points_A(i));
A_time_cut = A_time(Zero_Crossing_Points_A(i-1):Zero_Crossing_Points_A(i));
B_cut = B(Zero_Crossing_Points_B(i-1):Zero_Crossing_Points_B(i));
B_time_cut = B_time(Zero_Crossing_Points_B(i-1):Zero_Crossing_Points_B(i));
if length(A_cut) > 200
A_cut = A_cut(2:end);
A_time_cut = A_time_cut(2:end);
end
if length(B_cut) > 17
B_cut = B_cut(2:end);
B_time_cut = B_time_cut(2:end);
end
[tf, loc] = ismemberf(B_cut, A_cut, 'tol', 1.6);
if tf ~= 1
error('Worrning','One of the CAN values was not recognized by OMERCON values')
else
Delta = B_time_cut - A_time_cut(loc);
Delta_Angle = (Delta*360)/0.02;
Delta_time = mean([A_time_cut(loc) B_time_cut]');
if length(Delta) < 17
Delta(end+1:17) = 0;
Delta_time(end+1:17) = 0;
Delta_Angle(end+1:17) = 0;
%Delta = [Delta(1:end),zeros(length(Delta)+1:17)];
Delta_final_time = [Delta_final_time,Delta];
Delta_final_Angle = [Delta_final_Angle,((Delta*360)/0.02)];
time_Final = [time_Final,Delta_time'];
%tryy(i,1:length(Delta_Angle)) = Delta_Angle(1:end);
else
Delta_final_time = [Delta_final_time,Delta];
Delta_final_Angle = [Delta_final_Angle,((Delta*360)/0.02)];
time_Final = [time_Final,Delta_time'];
%tryy(i,1:length(Delta_Angle)) = Delta_Angle(1:end);
end
end
end
i = i + 1;
end
Delta_N_Loc = find(Delta_final_Angle < 0);
Delta_N_Loc_New = Delta_N_Loc + 1;
Delta_final_Angle(Delta_final_Angle < 0) = Delta_final_Angle(Delta_N_Loc_New);
time_Zeros = find(time_Final == 0);
time_Zeros_P_1 = time_Zeros + 1;
time_Zeros_N_1 = time_Zeros - 1;
time_Final(time_Final == 0) = ((time_Final(time_Zeros_N_1))+(time_Final(time_Zeros_P_1)))/2;
Delta_final_Angle_Zeros = find(Delta_final_Angle == 0);
Delta_final_Angle_Zeros_P_1 = Delta_final_Angle_Zeros + 1;
Delta_final_Angle_Zeros_N_1 = Delta_final_Angle_Zeros - 1;
Delta_final_Angle(Delta_final_Angle == 0) = ((Delta_final_Angle(Delta_final_Angle_Zeros_N_1))+(Delta_final_Angle(Delta_final_Angle_Zeros_P_1)))/2;
Delta_final_Angle_Round = round(Delta_final_Angle);
time_Final_r = reshape(time_Final,numel(time_Final),1);
Delta_final_Angle_r = reshape(Delta_final_Angle_Round,numel(Delta_final_Angle_Round),1);
if length(Delta_final_Angle_r) > length(time_Final_r)
Delta_final_Angle_r = Delta_final_Angle_r(1:length(time_Final_r));
end
end

请先登录,再进行评论。

更多回答(1 个)

Andrei Bobrov
Andrei Bobrov 2013-7-12
A = randi(25,10,1);
B = randi(30,20,1);
tolerance = 1;
out = abs(bsxfun(@minus,B(:),A(:).')) < tolerance;
  2 个评论
Aubai
Aubai 2013-7-12
编辑:Aubai 2013-7-12
Thanks for the fast replay i am now getting an out of memory error when perofrming this type of operation!! how can i over come that. note: A (713164*1 double) B (594301*1 double)

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Migrate GUIDE Apps 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by