Problem 71. Read a column of numbers and interpolate missing data
Given an input cell array of strings s, pick out the second column and turn it into a row vector of data. Missing data will be indicated by the number 9999. If you encounter missing data, you should perform linear interpolation to the nearest accurate data points (missing data will not occur in the first or last element).
The first row is always descriptive text. So if the input cell array s is
s = { ... 'Day Temp' ' 1 -5' ' 2 19' ' 3 1' ' 4 9999' ' 5 3'};
then the output variable t is the following row vector.
t = [-5 19 1 2 3];
Here's an example of real-world data.
Solution Stats
Problem Comments
-
9 Comments
Cody keeps throwing the error "Error using SharedVariable1 (line 11) Assertion failed." no matter what code is submitted.
Seems the test suite always calls the function with the same cell array 'Day Temp' ' 1 1.3' ' 2 1.12' ' 3 17' ' 4 -32' ' 5 13' ' 6 4.4' ' 7 19'.
I have fixed an issue with this problem where the test suite was not visible since there was no %% for the first test suite
keeps throwing Error for me too. Even though the answers are I get are the same as the test suite.
I suggest that there should have been some cases with more than one 'run' of 9999 values in the Test Suite, just as in the "real-world data". For example: clean for an input based on [100 100 9999 9999 100 200 9999 300 500], which has two (not three) 'runs'. (Testing interpolation with nil slope, as in this example, would also have been good to include.)
the problem makes you sweat, awesome!
This is working still would be appreciated for enhancement.
function t = read_and_interp(s)
s=strtrim(s);
row_num=numel(s);
counter=1;
for i=2:row_num
splitted=strsplit(s{i});
temp1=splitted(1);
temp2=splitted(2);
r(counter)=str2double(temp1);
r(counter+1)=str2double(temp2);
counter=counter+2;
end
first_column=r(1:2:end)
second_column=r(2:2:end)
if find(second_column==9999)>=1
first_column(find(second_column==9999))=[];
missed=find(second_column==9999);
second_column(find(second_column==9999))=[];
missed_value=interp1(first_column,second_column,missed)
second_column=r(2:2:end);
second_column(find(second_column==9999))=missed_value;
t=second_column
else
t=second_column
end
Good Problem
beware of splitting.
solution:
https://github.com/AhmedNazir/MatlabCody/blob/master/read_and_interp.m
Interesting!
Solution Comments
Show commentsProblem Recent Solvers2277
Suggested Problems
-
9970 Solvers
-
Back to basics 3 - Temp Directory
366 Solvers
-
Back to basics 25 - Valid variable names
323 Solvers
-
594 Solvers
-
484 Solvers
More from this Author96
Problem Tags
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!