56 views (last 30 days)

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?

Roger Stafford
on 24 Jun 2013

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.

Roger Stafford
on 25 Jun 2013

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
on 24 Jun 2013

Edited: Richard Brown
on 24 Jun 2013

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;

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.