Projecting Points to a new Basis
16 次查看(过去 30 天)
显示 更早的评论
Hi,
I'm probably missing something very fundamental here, but I'm not sure how to project a set of 520 coordinates in a 300-dimensional space to a new basis, A, which has dimensions 300 by n, n < 300.
I know that I can define the set of points to be a matrix B, dimensions 300 by 520. Then I can calculate for the projections using the equation when n = 1:
P = ((A * A') / (A' * A)) * B.
This works because A' * A is a singular value when n = 1 and thus the division can work. Is there a simple equation to calculate the projections of the points when n href = ""</a> 1?
0 个评论
回答(2 个)
Roger Stafford
2013-6-24
P = (A'*A)\(A'*B);
P will be an n by 520 matrix. Each column of P has the n components with respect to basis A of the corresponding column of B as projected orthogonally onto the subspace spanned by A. It is assumed here that A is a true basis of linearly independent columns, so that A'*A is non-singular.
1 个评论
Roger Stafford
2013-6-25
I think I should have explained yesterday's answer more thoroughly. The 512 n-element columns of the matrix P each consists of the linear coefficients for n corresponding columns of A which can be used to give the projected value of the corresponding column in B onto the space spanned by A columns. The 300-by-512 array P0 = A*P will have the projected values of corresponding vectors in B onto this space in terms of the original coordinates.
To give a concrete example, choose 3 instead of 300, 2 for n, and, say, 5 instead of 520. Then do this:
n = 2; m = 3; q = 5;
A = randn(m,n);
B = randn(m,q);
to form the two three-dimensional vectors as columns of A, and five 3D vectors as columns of B. Then write:
P = (A'*A)\(A'*B);
P0 = A*P;
P is a 2-by-5 array in which each column contains the two linear coefficients that would express the projection of the corresponding vector in B in terms of the two vectors in A. P0 is a 3-by-5 array which gives the actual coordinates of each of these projections in terms of the original coordinates.
You can check this out for, say, the third vector in B by:
a1 = A(:,1); a2 = A(:,2); % The two vectors of A
v = B(:,3); % The third vector of B
v1 = P0(:,3); % The projection of v onto space spanned by a1 and a2
v2 = v-v1; % v is decomposed into sum of projection and orthog. component
% Test that v2 vector is orthogonal to a1, a2, and v1
dot(v2,a1)
dot(v2,a2)
dot(v2,v1)
The very definition of P0 = A*P shows that P contains the described coefficients for vectors in A.
Richard Brown
2013-6-24
编辑:Richard Brown
2013-6-24
I'm not sure what your question is asking because you're missing a symbol off your question. But I think you mean if n is not equal to 1. Here's a method based on constructing a projector. Let's first set up the basis
n = 10;
A = rand(300, n);
I'm assuming your basis is linearly independent. Probably the nicest way is to orthonormalise the basis first and construct the projector P from it:
[Q, ~] = qr(A, 0);
P = Q*Q';
But you can skip that step if you want and construct P directly. However working with the matrix A'*A can lead to a badly conditioned problem
P = A*((A'*A)\A');
Projecting B is then easy
B = rand(300, 520);
Bproj = P*B;
0 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!