interp1 function not working properly
Show older comments
When I have signal of 1:130 and I interpolate it over 1:115/130:115 it returns array of only 129 values.
10 Comments
Why would you expect more than that?
size(1:115/130:115)
"interp1 function not working properly"
No, INTERP1 is working correctly.
However you did not check the data you are using, and so provided INTERP1 with exactly 129 values:
numel(1:115/130:115)
The cause is mathematics. Lets check the values by going two steps further:
V = 1:115/130:116;
X = (-4:0)+numel(V) % last five indices
V(X) % last five values
Note how element 129 has a value less than 115.
Note how element 130 has a value greater than 115.
So your step never actually reaches the value 115 (even within binary floating point precision). There is certainly no reason to expect to get 130 elements from that operation, and the mistake has absolutely nothing to do with INTERP1.
Solution: use LINSPACE.
Dominik Stolfa
on 26 Nov 2024
Dominik Stolfa
on 26 Nov 2024
" I went briefly through the links but I still don’t know how to fix it."
V = linspace(1,115,130)
V(130)
Or if you really want to obfuscate your code:
V = interp1([1,130],[1,115],1:130)
V(130)
V = rescale(1:130,1,115)
V(130)
V = 1+114.*(0:129)./129
V(130)
Dominik Stolfa
on 26 Nov 2024
Edited: Dominik Stolfa
on 26 Nov 2024
Dominik Stolfa
on 26 Nov 2024
Voss
on 26 Nov 2024
interp1(1:115,x(1:115),linspace(1,115,130))
Dominik Stolfa
on 26 Nov 2024
Image Analyst
on 26 Nov 2024
You should have already learned about quantization and truncation error when you took your college math course on linear algebra or numerical analysis. Hopefully this FAQ entry will supply your missing knowledge:
Accepted Answer
More Answers (1)
Image Analyst
on 26 Nov 2024
Like @Subhajyoti said, linspace would be the preferred way to get exactly the number of elements you want and to get it to end exactly in the number you want.
However, you said you want the last number to be 115 so there are two ways: either assign/overwrite the final number to 115, OR concatenate the 115 onto the existing vector.
v1 = linspace(1, 115, 130) % Best way.
% Using colon operator (less preferred than linspace():
v2 = 1 : (115/130) : 115 % 1 through 114.230769230769
% If you want the last value to be
% 115 instead of 114.230769230769 you can do this
v2(end) = 115;
% Or you can do this
v2 = 1 : (115/130) : 115 % 1 through 114.230769230769
v2 = [v2, 115] % Last two numbers are 114.230769230769 and 115.
9 Comments
"...either assign/overwrite the final number to 115"
Note that this does not change the number of elements in the vector.
"... OR concatenate the 115 onto the existing vector."
Note that in general this returns unequal spacing of the last value:
V = [1:115/130:115,115];
D = diff(V);
plot(D,'-*')
Solution: use LINSPACE.
Dominik Stolfa
on 26 Nov 2024
Dominik Stolfa
on 26 Nov 2024
Edited: Dominik Stolfa
on 26 Nov 2024
v = sym(1):sym(115)/sym(130):sym(115); disp(char(v))
Your algorithm for generating 130 values is faulty.
w = sym(0):sym(115)/sym(130):sym(115); disp(char(w))
Whereas starting from zero gives you something that ends exactly at 115 (at least when carried out to indefinite precision.)
whos v w
w has 131 values, not 130. It starts with 0, and the second element is less than 1, so if you were to discard the entries less than 1 then you would end up with only 129 values.
x = linspace(sym(1), sym(115), 130);
w1 = x(2)-x(1)
w2 = double(w1)
y1 = 1:w1:115
y2 = 1:w2:115
whos y1 y2
So if you want to use the colon operator, you need to use an increment of 38/43. Which is exactly (115-1)/(130-1)
Dominik Stolfa
on 26 Nov 2024
Walter Roberson
on 27 Nov 2024
Short summary:
In order to use 1:INCREMENT:115 and end up with 130 results, you need the increment to be (115-1)/(130-1)
Dominik Stolfa
on 28 Nov 2024
I don't know what you mean by "large fractions".
It works fine for 7/5
A = 1:(7-1)/(5-1):115;
A(end)
whos A
B = linspace(1,115,77);
[~,idx] = max(abs(A-B));
A(idx), B(idx), A(idx)-B(idx)
Dominik Stolfa
on 30 Nov 2024
Categories
Find more on Number Theory 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!