Interp1 question on excel data with multiple columns and blank/empty cells

4 views (last 30 days)
Hello,
I have an excel data which is a digitized plot for pressure (p) vs, distance (d), at different flame speeds.
E.g. attached, I have 11 flame speeds, and hence 11 p-columns with their 11 d-columns. For each flame speed, the pair (p vs.d) is independent of other pairs. However, # of rows is not same in all colums. E.g., Flame Speed-1 has 173 data points (rows) and Speed-2 has 55 datapoints. So, MATLAB is reading the empty rows as NaN, as expected.
At a given flame speed, and using the corresponding (p-d) pair, I want to use interp1 to estimate p for a d.
Any p-d column that has empty cells and hence NaN in MATLAB is giving Interp1 "finite data" error, as expected.
Also, Interp1 also doesn't work if I replace all NaN by a number (say 0); I am getting "absence of unique values" error.
I tried rmmissing to remove "missing data from excel", but it truncated the longer columns to the shortest column length.
To summarize my issue: how do I interpolate to calculate p at a d of 0.054 at Flame Speed 2 (attached excel sheet)? Since the p-d pair columns for Speed 1, 3, and 7 don't have NaN values, it can easily interpolate at these flame speeds. But not for other flame speeds.
Thanks for your help.
KD

Accepted Answer

Voss
Voss on 22 Aug 2022
% read the file:
M = readmatrix('p_d_FlameSpeed.xlsx');
% construct a cell array of two-column matrices of d and p values
% with the NaNs removed:
N = size(M,2)/2;
C = cell(1,N);
for ii = 1:N
C{ii} = M(:,(ii-1)*2+[1 2]);
% remove any row containing a NaN:
C{ii}(any(isnan(C{ii}),2),:) = [];
end
disp(C);
{173×2 double} {55×2 double} {173×2 double} {144×2 double} {137×2 double} {142×2 double} {172×2 double} {133×2 double} {126×2 double} {91×2 double} {69×2 double}
% perform the interpolation to find p for each speed at d = 0.054:
d = 0.054;
v = zeros(1,N);
for ii = 1:N
% some matrices contain non-unique d values (e.g., last two
% elements of Speed-d10), so just use the unique d and
% corresponding p for the interpolation:
[u_d,jj] = unique(C{ii}(:,1));
v(ii) = interp1(u_d,C{ii}(jj,2),d,'linear','extrap');
% for some speeds, d = 0.054 is outside the range of data,
% so I'm using extrapolation. to return NaNs in those
% cases instead, do the following:
% v(ii) = interp1(u_d,C{ii}(jj,2),d);
end
disp(v);
162.0349 99.7890 59.9832 36.0560 18.7795 9.0760 6.6703 5.6201 4.8827 2.2242 1.4585
  5 Comments

Sign in to comment.

More Answers (0)

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!