Creating few columns of the Vandermonde matrix without using vander
5 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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 Kommentare
Antworten (3)
Jan
am 8 Aug. 2011
Bearbeitet: Jan
am 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 Kommentare
Steven Morrow
am 15 Aug. 2017
Bearbeitet: Steven Morrow
am 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
am 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
am 8 Aug. 2011
1 Kommentar
Jan
am 8 Aug. 2011
Bearbeitet: Jan
am 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
am 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 Kommentare
Siehe auch
Kategorien
Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!