function pca3d( x, y, z ) % computes covariance matrix from the triples x, y, z % diagonalizes covariance matrix, i.e. performs pca on [ x, y, z ] % x, y and z are column vectors % covariance matrix: cv = cov( [ x y z ] ); % eigen values: [ v , d] = eig( cv ) % plots: subplot( 1, 2, 1 ); hold on; % scatter plot: view( 3 ); scatter3( x, y, z ); % , 1.0, 'b', 'filled' ); %, 'MarkerEdgeColor', 'blue' ); xlabel( 'x' ); ylabel( 'y' ); zlabel( 'z' ); grid on; % plot eigenvectors: quiver3( ones( 1, 3 ).*mean( x ), ones( 1, 3 )*mean(y), ones( 1, 3 )*mean(z), v(1,:).*sqrt(diag(d))', v(2,:).*sqrt(diag(d))', v(3,:).*sqrt(diag(d))', 'r' ); %, 'LineWidth', 3, 'AutoScale', 'off', 'AutoScaleFactor', 1.0, 'MaxHeadSize', 0.7 ) %axis( 'equal' ); hold off; % 2D scatter plots: subplot( 2, 6, 4 ); scatter( x, y, 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' ); xlabel( 'x' ) ylabel( 'y' ) subplot( 2, 6, 5 ); scatter( x, z, 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' ); xlabel( 'x' ) ylabel( 'z' ) subplot( 2, 6, 6 ); scatter( y, z, 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' ); xlabel( 'y' ) ylabel( 'z' ) % sort the eigenvalues: [d,inx] = sort( diag(d), 'descend' ); subplot( 2, 2, 4 ); hold on; % subtract means: x = x - mean( x ); y = y - mean( y ); % project onto eigenvectors: nx = [ x y z ] * v(:,inx); scatter( nx(:,1), nx(:,2), 'b', 'filled' ); %, 'MarkerEdgeColor', 'white' ); xlabel( 'ex' ) ylabel( 'ey' ) axis( 'equal' ); hold off; end