EigenvalueDecomposition( Matrix Arg ) { double[][] A = Arg; n = Arg.ColumnCount; V = Matrix.CreateMatrixData(n, n); d = new double[n]; e = new double[n]; isSymmetric = true; for (int j = 0; (j < n) & isSymmetric; j++) { for (int i = 0; (i < n) & isSymmetric; i++) { isSymmetric &= (A[i][j] == A[j][i]); } } if (isSymmetric) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { V[i][j] = A[i][j]; } } SymmetricTridiagonalize(); SymmetricDiagonalize(); } else { H = new double[n][]; for (int i = 0; i < n; i++) { double[] Hi = new double[n]; double[] Ai = A[i]; for (int j = 0; j < n; j++) { Hi[j] = Ai[j]; } H[i] = Hi; } NonsymmetricReduceToHessenberg(); NonsymmetricReduceHessenberToRealSchur(); } _eigenValuesReal = new Vector(d); _eigenValuesImag = new Vector(e); _eigenValues = ComplexVector.Create(d, e); InitOnDemandComputations(); }
EigenvalueDecomposition( double[] d, double[] e ) { // TODO: unit test missing for EigenvalueDecomposition constructor. n = d.Length; V = Matrix.CreateMatrixData(n, n); this.d = new double[n]; Array.Copy(d, 0, this.d, 0, n); this.e = new double[n]; Array.Copy(e, 0, this.e, 1, n - 1); for (int i = 0; i < n; i++) { V[i][i] = 1; } SymmetricDiagonalize(); _eigenValuesReal = new Vector(this.d); _eigenValuesImag = new Vector(this.e); _eigenValues = ComplexVector.Create(this.d, this.e); InitOnDemandComputations(); }
CrossProduct( IVector <Complex> u, IVector <Complex> v ) { CheckMatchingVectorDimensions(u, v); if (3 != u.Length) { throw new ArgumentOutOfRangeException("u", Resources.ArgumentVectorThreeDimensional); } ComplexVector product = new ComplexVector(new Complex[] { u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0] }); return(product); }