I have data from four different tests and I want to get an average
1 view (last 30 days)
Show older comments
Devansh Deepak Patel
on 27 Sep 2020
Commented: Devansh Deepak Patel
on 30 Sep 2020
I have load vs. deflection data of 4 different tests and I want to get an average out of it but all data has different number of rows. How do I make them equal and get an average Load-deflection plot?
clc;
clear;
Data=xlsread('LoadDeflData.xlsx');
x1= Data(:,2); x2= Data(:,4); x3=Data(:,6);x4=Data(:,8);
y1=Data(:,1);y2=Data(:,3);y3=Data(:,5);y4=Data(:,7);
figure(1)
plot(x1,y1); hold on;
plot(x2,y2); hold on;
plot(x3,y3); hold on;
plot(x4,y4); hold on;
0 Comments
Accepted Answer
Image Analyst
on 29 Sep 2020
Try this:
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 22;
filename = 'LoadDeflData.xls';
if ~isfile(filename)
errorMessage = sprintf('File not found:\n%s', filename)
uiwait(errordlg(errorMessage));
return;
end
% Data = xlsread(filename);
Data = readmatrix(filename);
x1 = Data(:,2); x2 = Data(:,4); x3 = Data(:,6); x4 = Data(:,8);
y1 = Data(:,1); y2 = Data(:,3); y3 = Data(:,5); y4 = Data(:,7);
%---------------------------------------------------------------------
% Get rid of nans:
badIndexes = isnan(x1);
x1(badIndexes) = [];
y1(badIndexes) = [];
% Get rid of nans:
badIndexes = isnan(x2);
x2(badIndexes) = [];
y2(badIndexes) = [];
% Get rid of nans:
badIndexes = isnan(x3);
x3(badIndexes) = [];
y3(badIndexes) = [];
% Get rid of nans:
badIndexes = isnan(x4);
x4(badIndexes) = [];
y4(badIndexes) = [];
%---------------------------------------------------------------------
% The next problem: many of the x values are duplicates and that causes problems with interpolation.
% So we need to get the average y for each duplciated x
% First get group means for set #1:
groups = findgroups(x1);
x1 = splitapply(@mean, x1, groups);
y1 = splitapply(@mean, y1, groups);
% First get group means for set #2:
groups = findgroups(x2);
x2 = splitapply(@mean, x2, groups);
y2 = splitapply(@mean, y2, groups);
% First get group means for set #3:
groups = findgroups(x3);
x3 = splitapply(@mean, x3, groups);
y3 = splitapply(@mean, y3, groups);
% First get group means for set #4:
groups = findgroups(x4);
x4 = splitapply(@mean, x4, groups);
y4 = splitapply(@mean, y4, groups);
%---------------------------------------------------------------------
% Plot repaired curves.
plot(x1, y1, '-', 'LineWidth', 2);
grid on;
hold on;
plot(x2, y2, '-', 'LineWidth', 2);
plot(x3, y3, '-', 'LineWidth', 2);
plot(x4, y4, '-', 'LineWidth', 2);
grid on;
legend('y1', 'y2', 'y3', 'y4');
% Maximize figure window.
g = gcf;
g.WindowState = 'maximized';
%---------------------------------------------------------------------
% Get a list of all the x's and get the unique values from the entire list.
x = unique([x1; x2; x3; x4]);
%---------------------------------------------------------------------
% Interpolate y values.
% Get new y with values at every x value possible.
y1a = interp1(x1, y1, x);
y2a = interp1(x2, y2, x);
y3a = interp1(x3, y3, x);
y4a = interp1(x4, y4, x);
%---------------------------------------------------------------------
% Compute the average at each of those x values.
averageY = (y1a + y2a + y3a + y4a) / 4;
plot(x, averageY, 'k-', 'LineWidth', 7);
legend('y1', 'y2', 'y3', 'y4', 'average y');
This gives values for where the x is there for all curves. If you want to continue to take the average where there are fewer curves, like beyond 0.3 where there are only 3 curves instead of 4, you'll have to add a few lines of code. If this does the trick, please "Accept this answer". Thanks in advance.
More Answers (1)
Image Analyst
on 27 Sep 2020
You blew by the posting guidelines and forgot to attach any data!
Do you have unique x and y values for each? Then I'd get a common set of x like
x = unique([x1, x2, x3, x4]));
% Get new y with values at every x value possible.
y1a = interp1(x1, y1, x);
y2a = interp1(x2, y2, x);
y3a = interp1(x3, y3, x);
y4a = interp1(x4, y4, x);
% Compute the average at each of those x values.
averageY = (y1a+y2a+y3a+y4a)/4;
3 Comments
Image Analyst
on 28 Sep 2020
Edited: Image Analyst
on 28 Sep 2020
Please give me code to get the x and y. I see only 3 possible vectors in there, not 4. Also I'm not sure I'm getting them out right because this is what I got:
filename = 'LoadDeflData.xls'
data = readmatrix(filename)
x1 = data(:, 1);
y1 = data(:, 2);
% Get rid of nans:
badIndexes = isnan(x1);
x1(badIndexes) = [];
y1(badIndexes) = [];
plot(x1, y1, '-', 'LineWidth', 2);
grid on;
hold on;
x2 = data(:, 3);
y2 = data(:, 4);
% Get rid of nans:
badIndexes = isnan(x2);
x2(badIndexes) = [];
y2(badIndexes) = [];
plot(x2, y2, '-', 'LineWidth', 2);
x3 = data(:, 5);
y3 = data(:, 6);
% Get rid of nans:
badIndexes = isnan(x3);
x3(badIndexes) = [];
y3(badIndexes) = [];
plot(x3, y3, '-', 'LineWidth', 2);
% Get a list of all the x's.
x = unique([x1; x2; x3]);
% Get new y with values at every x value possible.
y1a = interp1(x1, y1, x);
y2a = interp1(x2, y2, x);
y3a = interp1(x3, y3, x);
% Compute the average at each of those x values.
averageY = (y1a+y2a+y3a)/3;
plot(x, averageY, '-', 'LineWidth', 2);
legend('y1', 'y2', 'y3', 'average y');
It looks like the curves have 2 y values for some x values.
See Also
Categories
Find more on Migrate GUIDE Apps in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!