Creating few columns of the Vandermonde matrix without using vander
16 views (last 30 days)
Show older comments
Hi,
I want to create the first n columns of the Vandermonde matrix (I need this matrix in order to fit a curve through given points with the lsqlin function). Of course the commands:
A = vander(x);
A = A(1:n);
would do the work, but since the vector x might have over million values and n could be very small, 10 for example, it would be very inefficient.
I already did it with a for loop:
A = ones(length(x), n);
for i = 2 : n
A(:, i) = (x.^(i - 1));
end
but I think it can be done more elegant without a loop. Is there a function that does this? Or can someone give me an idea how to do it without a loop? I am thinking that repmat or reshape might be useful.
0 Comments
Answers (3)
Jan
on 8 Aug 2011
Edited: Jan
on 16 Aug 2017
You calculate the Vandermonde matrix from right to left. Is this intented? Do you want to get the n leftmost columns (smallest values)?
The power operation consumes a lot of time.
function A = ShortVander(x, n)
x = x(:); % Column vector
A = ones(length(x), n);
for i = 2:n
A(:, i) = x .* A(:, i-1); % [EDITED, Thanks Steven]
end
Look into the source code of VANDER to find a very equal approach...
3 Comments
Steven Morrow
on 15 Aug 2017
Edited: Steven Morrow
on 15 Aug 2017
The multiplication should be compnenet-wise, i.e. the line in the for loop should be A(:,i) = x.*A(:,i-1)
Are Mjaavatten
on 6 Apr 2022
This is nice, but why not let the built-in vander function take the number of columns as an optional second argument?
Aleksandar
on 8 Aug 2011
1 Comment
Jan
on 8 Aug 2011
Edited: Jan
on 16 Aug 2017
Please compare the times with my posted FOR loop. Under Matlab 2009a and for x = rand(1, 1000) the CUMPROD method needs >50% more time. I've tried this version before I've posted the loop:
function A = ShortVander(x, n)
v = v(:);
A = v(:, ones(1, n));
A(:, 1) = 1;
A = cumprod(A);
But this is also about 50% slower than the loop. If you work with large arrays it has the additional problem, that it needs a lot of temporary memory.
Steven Lord
on 6 Apr 2022
You could do this pretty easily if you know the powers to which you want to raise the data used to create the Vandermonde matrix.
data = 1:6;
powers = [5 3 1];
V = vander(data)
V2 = reshape(data, [], 1).^powers
The columns of V2 are the first, third, and fifth columns of V corresponding to data^5, data^3, and data^1.
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!