12 views (last 30 days)

Last week I got data from an experiment with three repeats, and unlike all of the examples in previous experience the times that the samples were collected are slightly different, as an example:

t_1 = [0 1 2 3 4 5], x_1 = [0 10 20 30 40 50]

t_2 = [0.1 1.1 2.1 3.2 4.2 5.4], x_2 = [0 9 19 29 38 40 51]

t_3 = [0 0.9 2 3.1 3.9 4.8], x_3 = [0 11 21 31 39 48]

For the sake of analyzing the data I would like to reduce this data to one set.

I thought of a couple of options: taking time intervals and averaging the data within that interval, or maybe interpolating the data for each data set onto fixed times and then averaging those values. Either of these seem fine, with the latter being preferable. However, the real data set is extensive and I was wondering if there was an easy way of summarizing this data? Currently the only way i could solve it would be with a tonne of if and for statements which would be very tedious, probably wouldn't save much time and may not even work.

Any help would be greatly appriciated!

Stephan
on 16 Aug 2018

Edited: Stephan
on 16 Aug 2018

Hi,

a further approach would be not to manipulate data, but use all the Information the data contains and make a fit function with least suqared minimized coefficients:

t_1 = [0 1 2 3 4 5];

x_1 = [0 10 20 30 40 50];

t_2 = [0.1 1.1 2.1 3.2 4.2 5.4];

x_2 = [0 9 19 29 38 51];

t_3 = [0 0.9 2 3.1 3.9 4.8];

x_3 = [0 11 21 31 39 48];

% combine all data in one set and sort this set by time

A(:,1) = horzcat(t_1,t_2,t_3);

A(:,2) = horzcat(x_1,x_2,x_3);

sortrows(A,1)

% plot the data

plot(A(:,1),A(:,2),'*r')

hold on

% Solve least squares problem

x0 = [1 1];

x_data = A(:,1);

sol = lsqcurvefit(@myfun,x0,A(:,1),A(:,2));

% show results

disp(['y = ', num2str(sol(1)), ' * ', ' x + ' , num2str(sol(2))])

x_new = 0:6;

y_new = sol(1) .* x_new + sol(2);

plot(x_new,y_new)

hold off

% target function to find coefficients

function F = myfun(x,xdata)

F = x(1)*xdata + x(2);

end

This gives you a least squares fit of all the data without manipulating them:

Best regards

Stephan

Eduard Reitmann
on 16 Aug 2018

I noticed that your t_2 and x_2 variables are not the same length. Once you fixed that, this should work:

t = linspace(0,max([t_1 t_2 t_3]),11);

x(:,1) = interp1(t_1,x_1,t);

x(:,2) = interp1(t_2,x_2,t);

x(:,3) = interp1(t_3,x_3,t);

xm = mean(x,2);

The first line can be modified to change the number of averaging points and interval. You can plot the average like this:

plot(t_1,x_1,'o',t_2,x_2,'o',t_3,x_3,'o',t,xm,'r')

Peter Perkins
on 24 Aug 2018

Stephan's is an interesting and powerful approach. Alex, what you described in your question is a good deal simpler. Tak a look at timetables, and in particular, their synchronize method. It's a one-liner.

>> t_1 = [0 1 2 3 4 5]';

>> x_1 = [0 10 20 30 40 50]';

>> tt1 = timetable(seconds(t_1),x_1);

>> t_2 = [0.1 1.1 2.1 3.2 4.2 5.4]';

>> x_2 = [0 9 19 29 38 51]'; % I deleted 40

>> tt2 = timetable(seconds(t_2),x_2);

>> t_3 = [0 0.9 2 3.1 3.9 4.8]';

>> x_3 = [0 11 21 31 39 48]';

>> tt3 = timetable(seconds(t_3),x_3);

>> tt = synchronize(tt1,tt2,tt3,'first','spline')

tt =

6×3 timetable

Time x_1 x_2 x_3

_____ ___ ________ ______

0 sec 0 -0.74839 0

1 sec 10 8.0136 12.007

2 sec 20 18.027 21

3 sec 30 27.241 30.041

4 sec 40 36.129 40.018

5 sec 50 46.241 49.894

Opportunities for recent engineering grads.

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

Start Hunting!
## 0 Comments

Sign in to comment.