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 Solvers2282
Suggested Problems
-
7294 Solvers
-
How to find the position of an element in a vector without using the find function
2728 Solvers
-
1008 Solvers
-
Find the maximum number of decimal places in a set of numbers
2854 Solvers
-
Rotate input square matrix 90 degrees CCW without rot90
612 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!