When to use Linspace?
Plotting sine functions using linspace command
arrays - What is the advantage of linspace over the colon ":" operator? - Stack Overflow
What is the difference between a vector and using linspace?
Videos
I'm working with continuous-time (CT) and discrete-time (DT) signal and want to plot them in Matlab.
For CT, when I used the function linspace to create a vector of values and then use that to have a function (t1, x1 and t2, x2). I then plot the value of x() against the created t(). The graphs I got were different with different length of my vector generated by linspace and none of them seems correct. (The correct version is using the normal method* of creating vector (t3, x3)).
Code:
f=100; %Frequency t1=linspace(0,1,100); %From 0 to 1 in 100 steps t2=linspace(0,1,300); %From 0 to 1 in 300 steps t3=0:0.001:1; %From 0 to 1 and increment by 0,001 x1=cos(2*pi*f*t1); x2=cos(2*pi*f*t2); x3=cos(2*pi*f*t3); subplot(3,1,1); plot(t1,x1); subplot(3,1,2); plot(t2,x2); subplot(3,1,3); plot(t3,x3);
The same problem does not apply whether or not I use linspace or normal method* to create an array to plot magnitude and phase of a function.
Code:
w=linspace(-10*pi,10*pi,1000); xa=(i*w)./(1+i*w); figure(1); subplot(2,1,1);plot(w,abs(xa));grid on; subplot(2,1,2);plot(w,angle(xa));grid on;
If I generate w by normal method*, the graph still looks the same.
Can someone please explain!
Thanks.
Graphs of (t1, x1) (t2, x2) (t3, x3)It's not just the usability. Though the documentation says:
The
linspacefunction generates linearly spaced vectors. It is similar to the colon operator :, but gives direct control over the number of points.
it is the same, the main difference and advantage of linspace is that it generates a vector of integers with the desired length (or default 100) and scales it afterwards to the desired range. The : colon creates the vector directly by increments.
Imagine you need to define bin edges for a histogram. And especially you need the certain bin edge 0.35 to be exactly on it's right place:
edges = [0.05:0.10:.55];
X = edges == 0.35
edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500
X = 0 0 0 0 0 0
does not define the right bin edge, but:
edges = linspace(0.05,0.55,6); %// 6 = (0.55-0.05)/0.1+1
X = edges == 0.35
edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500
X = 0 0 0 1 0 0
does.
Well, it's basically a floating point issue. Which can be avoided by linspace, as a single division of an integer is not that delicate, like the cumulative sum of floting point numbers. But as Mark Dickinson pointed out in the comments:
You shouldn't rely on any of the computed values being exactly what you expect. That is not what linspace is for. In my opinion it's a matter of how likely you will get floating point issues and how much you can reduce the probabilty for them or how small can you set the tolerances. Using linspace can reduce the probability of occurance of these issues, it's not a security.
That's the code of linspace:
n1 = n-1
c = (d2 - d1).*(n1-1) % opposite signs may cause overflow
if isinf(c)
y = d1 + (d2/n1).*(0:n1) - (d1/n1).*(0:n1)
else
y = d1 + (0:n1).*(d2 - d1)/n1
end
To sum up: linspace and colon are reliable at doing different tasks. linspace tries to ensure (as the name suggests) linear spacing, whereas colon tries to ensure symmetry
In your special case, as you create a vector of integers, there is no advantage of linspace (apart from usability), but when it comes to floating point delicate tasks, there may is.
The answer of Sam Roberts provides some additional information and clarifies further things, including some statements of MathWorks regarding the colon operator.
linspace and the colon operator do different things.
linspace creates a vector of integers of the specified length, and then scales it down to the specified interval with a division. In this way it ensures that the output vector is as linearly spaced as possible.
The colon operator adds increments to the starting point, and subtracts decrements from the end point to reach a middle point. In this way, it ensures that the output vector is as symmetric as possible.
The two methods thus have different aims, and will often give very slightly different answers, e.g.
>> a = 0:pi/1000:10*pi;
>> b = linspace(0,10*pi,10001);
>> all(a==b)
ans =
0
>> max(a-b)
ans =
3.5527e-15
In practice, however, the differences will often have little impact unless you are interested in tiny numerical details. I find linspace more convenient when the number of gaps is easy to express, whereas I find the colon operator more convenient when the increment is easy to express.
See this MathWorks technical note for more detail on the algorithm behind the colon operator. For more detail on linspace, you can just type edit linspace to see exactly what it does.