Michael,
    Thanks for your bug report. I'll add your report to the existing SVD
bug report we've received earlier. 

4193466 GMatrix SVD does not work correctly for some cases.

thanks,
    Chien Yang
    Java 3D, Sun Microsystems Inc.


Michael Duffy wrote:
I don't believe the SVD implementation is working
properly.

I ran a simple problem from Gil Strang's linear
algebra course
(http://web.mit.edu/18.06/www/Fall03/ps1.pdf, problem
3) that has a solution available using LU
decomposition.

When I ran the problem using the LU solver (see
LUTest.java, attached) it gave the correct result.

When I ran the problem using the SVD solver (see
SVDTest.java, attached) it did not give the correct
result.

When I run the SVD solver for a matrix that isn't
square, I get the following exception:

java.lang.ArrayIndexOutOfBoundsException: 2
        at
javax.vecmath.GMatrix.computeSVD(GMatrix.java:2055)
        at
javax.vecmath.GMatrix.SVD(GMatrix.java:1574)
        at SVDTest.main(SVDTest.java:107)

Please advise. - MOD





__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com

import javax.vecmath.* ; public class LUTest { // See public static final int nrows = 3; public static final int ncols = 3; public static final double [] aInput = { 1, 1, 0, 4, 6, 1, -2, 2, 0, }; public static final double [] bInput = { 1, 4, -10, }; public static void main (String[] args) { try { // Create the A matrix GMatrix a = new GMatrix(nrows, ncols, aInput); System.out.println("a: "); System.out.println(a); // Perform LU decomposition GVector permutation = new GVector(nrows); int numExchanges = a.LUD(a, permutation); // Create the RHS vector GVector b = new GVector(bInput); System.out.println("b:"); System.out.println(b); // Perform back substitution GVector x = new GVector(nrows); x.LUDBackSolve(a, b, permutation); System.out.println("result:"); System.out.println(x); } catch (Exception e) { e.printStackTrace(System.err); } } }

import javax.vecmath.* ; public class SVDTest { // From http://web.mit.edu/18.06/www/Fall03/ps1.pdf // Gil Strang's course Web site. /* public static final int nrows = 3; public static final int ncols = 3; public static final double [] aInput = { 1, 1, 0, 4, 6, 1, -2, 2, 0, }; public static final double [] bInput = { 1, 4, -10, }; */ /* public static final int nrows = 12; public static final int ncols = 11; public static final double[] aInput = { 0,1,0,1,0,0,0,0, 0, -58, 0, 0,0,0,0,0,1,0,1, 0, -201, 0, 0,1,1,1,0,0,0,0, 0, -53, -53, 0,0,0,0,0,1,1,1, 0, -52, -52, 0,0,0,1,0,0,0,0, 0, 0, 0, 0,0,0,0,0,0,0,1, 0, 0, 0, 0,0,1,1,0,0,0,0, 0, 0, -156, 0,0,0,0,0,0,1,1, 0, 0, -44, 1,0,0,1,0,0,0,0, -263, 0, 0, 0,0,0,0,1,0,0,1, -193, 0, 0, 1,0,1,1,0,0,0,0, -259, 0, -259, 0,0,0,0,1,0,1,1, -45, 0, -45, }; public static final double[] bInput = { 58.,201.,53.,52.,159.,181.,156.,44.,263.,193.,259.,45. }; */ // From http://www.bluebit.gr/matrix/reference/SVD-Example.htm // Solution vector: x = { 4.089, 3.066, 2.163, } /* public static final int nrows = 20; public static final int ncols = 3; public static final double[] aInput = { 6, 5, 5, 3, 3, 7, 0, 7, 7, 6, 0, 4, 8, 7, 3, 9, 8, 1, 9, 3, 5, 7, 0, 5, 4, 3, 6, 6, 2, 3, 7, 7, 5, 9, 8, 2, 6, 9, 2, 5, 1, 9, 6, 0, 5, 1, 1, 7, 3, 0, 3, 3, 3, 9, 9, 4, 3, 1, 1, 6, }; public static final double[] bInput = { 51, 37, 37, 33, 60, 64, 55, 40, 39, 38, 59, 65, 58, 43, 35, 24, 21, 39, 57, 20, }; */ // From http://cs.uakron.edu/~quesada/Courses/LinAlg/Projects/svdpaper.pdf public static final int nrows = 2; public static final int ncols = 3; public static final double [] aInput = { 3, 2, 2, 2, 3, -2, }; public static final double [] bInput = { 3, 2, }; public static void main(String[] args) { try { // Create the A matrix GMatrix a = new GMatrix(nrows, ncols, aInput); System.out.println("a:"); System.out.println(a); // Perform the SVD GMatrix u = new GMatrix(nrows, nrows); GMatrix w = new GMatrix(nrows, ncols); GMatrix v = new GMatrix(ncols, ncols); int rank = a.SVD(u,w,v); System.out.println("rank: " + rank); System.out.println("u:"); System.out.println(u); System.out.println("v:"); System.out.println(v); System.out.println("w:"); System.out.println(w); // Check to make sure that transpose(U)*U = identity GMatrix utranspose = new GMatrix(u); utranspose.transpose(); GMatrix udelta = new GMatrix(ncols, ncols); udelta.mul(utranspose, u); System.out.println("udelta:"); System.out.println(udelta); // Check to make sure that transpose(V)*V = identity GMatrix vtranspose = new GMatrix(v); vtranspose.transpose(); GMatrix vdelta = new GMatrix(ncols, ncols); vdelta.mul(vtranspose, v); System.out.println("vdelta:"); System.out.println(vdelta); // Create the RHS vector GVector b = new GVector(bInput); System.out.println("b:"); System.out.println(b); // Perform back substitution GVector x = new GVector(nrows); x.SVDBackSolve(u, w, v, b); System.out.println("result:"); System.out.println(x); } catch (Exception e) { e.printStackTrace(System.err); } } }

=========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA3D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to