public static SquareMatrix operator *(SquareMatrix Matrix, double Scalar) { SquareMatrix ReturnMatrix = new SquareMatrix(Matrix.RowSize); for (int Row = 0; Row < Matrix.RowSize; Row++) for (int Col = 0; Col < Matrix.ColSize; Col++) ReturnMatrix[Row, Col] = Matrix[Row, Col] * Scalar; return ReturnMatrix; }
/// <summary> /// 逆行列を取得します。 /// </summary> /// <param name="SquareMatrix">元になる正方行列</param> /// <returns>逆行列</returns> public SquareMatrix GetInverseMatrix() { int i, j, k, matrixLength = base.Vectors.Length; //元の行列 SquareMatrix BaseMatrix = new SquareMatrix(base.Vectors); //逆行列が入るベクトル。今は単位行列。 SquareMatrix InverseMatrix = SquareMatrix.IdentityMatrix(matrixLength); double temp; for (i = 0; i < matrixLength; i++) { temp = 1 / BaseMatrix[i,i]; for (j = 0; j < matrixLength; j++) { BaseMatrix[i, j] *= temp; InverseMatrix[i, j] *= temp; } for (j = 0; j < matrixLength; j++) { if (i != j) { temp = BaseMatrix[j, i]; for (k = 0; k < matrixLength; k++) { BaseMatrix[j, k] -= BaseMatrix[i, k] * temp; InverseMatrix[j, k] -= InverseMatrix[i, k] * temp; } } } } return InverseMatrix; }
/// <summary> /// 行列式の値を取得 /// </summary> /// <returns>行列式の値</returns> public double GetDet() { double det = 1d; int dim = this.ColSize; SquareMatrix WorkMatrix = new SquareMatrix(this); for (int i = 0; i < dim; i++) for (int j = 0; j < dim; j++) if (i < j) { double buf = WorkMatrix[j, i] / WorkMatrix[i, i]; for (int k = 0; k < dim; k++) WorkMatrix[j, k] -= WorkMatrix[i, k] * buf; } //対角部分の積 for (int i = 0; i < dim; i++) det *= WorkMatrix[i, i]; return det; }
/// <summary> /// 指定した階数の単位行列を取得します。 /// </summary> /// <param name="Rank">階数</param> /// <returns>単位行列</returns> public static SquareMatrix IdentityMatrix(int Rank) { SquareMatrix ReturnMatrix = new SquareMatrix(Rank); for (int i = 0; i < Rank; i++) ReturnMatrix[i, i] = 1d; return ReturnMatrix; }
public static SquareMatrix operator /(SquareMatrix LeftMatrix, double Scalar) { SquareMatrix ReturnMatrix = new SquareMatrix(LeftMatrix.RowSize); for (int Row = 0; Row < LeftMatrix.RowSize; Row++) for (int Col = 0; Col < LeftMatrix.ColSize; Col++) ReturnMatrix[Row, Col] = LeftMatrix[Row, Col] / Scalar; return ReturnMatrix; }
public static SquareMatrix operator -(SquareMatrix LeftMatrix, SquareMatrix RightMatrix) { if (LeftMatrix.ColSize != RightMatrix.ColSize || LeftMatrix.RowSize != RightMatrix.RowSize) throw new ApplicationException("左右の行列の大きさが一致しません"); SquareMatrix ReturnMatrix = new SquareMatrix(LeftMatrix.RowSize); for (int Row = 0; Row < ReturnMatrix.RowSize; Row++) for (int Col = 0; Col < ReturnMatrix.ColSize; Col++) { double SetValue = LeftMatrix[Row, Col] - RightMatrix[Row, Col]; ReturnMatrix[Row, Col] = SetValue; } return ReturnMatrix; }
public TransitionProbabilityMatrix(SquareMatrix Matrix) { this.Vectors = (ColumnVector[])Matrix.ColumnVector.Clone(); }