I have data from four different tests and I want to get an average
1 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Image Analyst
2020-9-29
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.
更多回答(1 个)
Image Analyst
2020-9-27
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 个评论
Image Analyst
2020-9-28
编辑:Image Analyst
2020-9-28
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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Migrate GUIDE Apps 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!