标签:
线性空间的算法不是特别多,这里是代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyMathLib { /// <summary> /// 线性空间 /// </summary> public class LinearSpace { /// <summary> /// 求向量Vector在基底BasisOfLinearSpace下的坐标向量 /// </summary> /// <param name="BasisOfLinearSpace">线性空间的基</param> /// <param name="Vector">目标向量</param> /// <returns>坐标向量.</returns> public static double[] CalcVectorCoordinate(List<double[]> BasisOfLinearSpace,double[] Vector) { if (BasisOfLinearSpace == null && BasisOfLinearSpace.Count <= 0) { throw new Exception("基底不能为空!"); } var theCoeffs = BasisOfLinearSpace.To2DArrayT(); var theRet = LinearAlgebra.LinearEquationsEM2(theCoeffs, Vector); if (theRet.SolutionType == SolutionType.OnlyOne) { return theRet.SolutionVectors[0]; } throw new Exception("参数错误!"); } /// <summary> /// 求向量Vector在另一个基底下的坐标向量 /// </summary> /// <param name="P">过渡矩阵</param> /// <param name="Vector">向量</param> /// <returns>坐标向量.</returns> public static double[] CalcVectorY(double[,] P, double[] Vector) { if (P == null || P.GetLength(0) <= 0 || P.GetLength(1) <= 0) { throw new Exception("过渡矩阵不能为空!"); } var theP = new TMatrix(P); var theP1 = TMatrix.GetInverseMatrix(theP); double[][] theVectors = new double[1][]; theVectors[0] = Vector; var theAt = TMatrix.Transposition(new TMatrix(theVectors)); var theRet = (theP1 * theAt); return theRet.Elements.GetVectorCol(0); } /// <summary> /// 获取T在此基底下的坐标矩阵A. /// </summary> /// <param name="P">变换矩阵</param> /// <param name="BasisVectors">基底</param> /// <returns>坐标矩阵A</returns> public static TMatrix CalcCoordinateMatrixOfT(double[,] P, List<double[]> BasisVectors) { if (BasisVectors ==null || P == null || P.GetLength(0) <= 0 || P.GetLength(1) <= 0 || P.GetLength(0)!=P.GetLength(1) || P.GetLength(0)!=BasisVectors.Count || BasisVectors.Count <=0 || BasisVectors[0].Length != BasisVectors.Count) { throw new Exception("参数有误!"); } var theBasis = BasisVectors.To2DArrayT(); var theBasisM = new TMatrix(theBasis); var thePM = new TMatrix(P); var theBasisM_1 = TMatrix.GetInverseMatrix(theBasisM); return theBasisM_1 * thePM * theBasisM; } /// <summary> /// 获取T在此BasisVectors基底下的关系矩阵P. /// </summary> /// <param name="A">T在基底下的坐标矩阵A</param> /// <param name="BasisVectors">基底矩阵</param> /// <returns>坐标矩阵A</returns> public static TMatrix CalcRelationMatrixOfT(double[,] A, List<double[]> BasisVectors) { if (BasisVectors == null || A == null || A.GetLength(0) <= 0 || A.GetLength(1) <= 0 || A.GetLength(0) != A.GetLength(1) || A.GetLength(0) != BasisVectors.Count || BasisVectors.Count <= 0 || BasisVectors[0].Length != BasisVectors.Count) { throw new Exception("参数有误!"); } var theBasis = BasisVectors.To2DArrayT(); var theBasisM = new TMatrix(theBasis); var thePM = new TMatrix(A); var theBasisM_1 = TMatrix.GetInverseMatrix(theBasisM); return theBasisM * thePM * theBasisM_1; } } }
标签:
原文地址:http://blog.csdn.net/hawksoft/article/details/42500707