// Vectorとの統一感がないので保留 ///// <summary> ///// 部分行列を作成する. ///// </summary> ///// <param name="beginRow">開始行</param> ///// <param name="beginColumn">開始列</param> ///// <param name="countRow">抽出する行数</param> ///// <param name="countColumn">抽出する列数</param> ///// <returns>部分行列</returns> //public Matrix Submatrix(int beginRow, int beginColumn, int countRow, int countColumn) //{ // if (beginRow < 0 || this.RowSize <= beginRow || beginColumn < 0 || this.ColumnSize <= beginColumn) // { // throw new IndexOutOfRangeException(); // } // // Matrix ret = new Matrix(countRow, countColumn); // for (int r = 0; r < countRow; ++r) // { // for (int c = 0; c < countColumn; ++c) // { // ret[r, c] = this[beginRow + r, beginColumn + c]; // } // } // return ret; //} #region 換出力 /// <summary> /// 行列の各行を<see cref="RowVector"/>の配列として出力する. /// </summary> /// <returns><see cref="RowVector"/>の配列</returns> public RowVector[] ToRowVectors() { RowVector[] ret = new RowVector[this.RowSize]; for (int r = 0; r < this.RowSize; ++r) { ret[r] = new RowVector(this.Rows[r]); } return(ret); }
public static void CanMultiply(RowVector rv, Matrix m) { if (rv.Size != m.RowSize) { throw new Exception.CannotMultiplyException( "Matrix.RowSize=" + m.RowSize + ", Matrix.ColumnSize=" + m.ColumnSize + ", RowVector.Size=" + rv.Size); } }
/// <summary> /// 行ベクトルと行列の乗算 /// </summary> /// <param name="rv">行ベクトル</param> /// <param name="m">行列</param> /// <returns>乗算結果の行ベクトル</returns> public static RowVector operator *(RowVector rv, Matrix m) { MatrixChecker.CanMultiply(rv, m); RowVector ret = new RowVector(); clapack.Function.dgemv(ref ret._body, rv._body, m._body, m._rsize, m._csize); return(ret); }
/// <summary> /// 行ベクトルと行列の乗算 /// </summary> /// <param name="rv">行ベクトル</param> /// <param name="m">行列</param> /// <returns>乗算結果の行ベクトル</returns> public static RowVector operator *(RowVector rv, Matrix m) { MatrixChecker.CanMultiply(rv, m); RowVector ret = new RowVector(); krdlab.law.func.dgemv(ref ret._body, rv._body, m._body, m._rsize, m._csize); return(ret); }
public static void CanMultiply(RowVector rv, Matrix m) { if (rv.Size != m.RowSize) { throw new ArgumentException( "Matrix.RowSize=" + m.RowSize + ", Matrix.ColumnSize=" + m.ColumnSize + ", RowVector.Size=" + rv.Size); } }
public void Test_Combination() { RowVector rv = new RowVector(1, 2, 3); ColumnVector cv = new ColumnVector(1, 2, 3); Assert.That(rv * cv, Is.EqualTo(14).Within(Ep)); Assert.That(cv * rv, Is.EqualTo( new Matrix(new [,] { { 1.0, 2, 3 }, { 2, 4, 6 }, { 3, 6, 9 } }) ).Within(Ep) ); }
public void Test_VectorOperator() { Matrix A; A = new Matrix(new double[,]{ { 5, 3 }, { 2, -1 }, { 4, 2 }, }); ColumnVector cv = new ColumnVector(-1, 1); ColumnVector Yc = A * cv; Assert.AreEqual(new ColumnVector(-2, -3, -2), Yc); RowVector rv = new RowVector(-2, 0, 1); RowVector Yr = rv * A; Assert.AreEqual(new RowVector(-6, -4), Yr); }
public void Test_Vector_RowVector_Operator() { // Vector ��������ƁC�S�� Vector �ɂȂ� (���ۂɂȂ�) Vector l = new Vector(1, 1, 1); Vector r = new Vector(1, 1, 1); RowVector rv = new RowVector(1, 1, 1); Vector add = l + rv; Assert.That(add, Is.Not.InstanceOf(typeof(RowVector))); Assert.True(Vector.Equals(add, new Vector(2, 2, 2), Ep)); add = rv + r; Assert.That(add, Is.Not.InstanceOf(typeof(RowVector))); Assert.True(Vector.Equals(add, new Vector(2, 2, 2), Ep)); Vector sub = l - rv; Assert.That(sub, Is.Not.InstanceOf(typeof(RowVector))); Assert.True(Vector.Equals(sub, new Vector(0, 0, 0), Ep)); sub = rv - r; Assert.That(sub, Is.Not.InstanceOf(typeof(RowVector))); Assert.True(Vector.Equals(sub, new Vector(0, 0, 0), Ep)); }
public void Test_RowVector_Operator() { RowVector l = new RowVector(1, 1, 1); RowVector r = new RowVector(1, 1, 1); RowVector add = l + r; Assert.True(RowVector.Equals(add, new RowVector(2, 2, 2), Ep)); RowVector sub = l - r; Assert.True(RowVector.Equals(sub, new RowVector(0, 0, 0), Ep)); RowVector mul = l * 2; Assert.True(RowVector.Equals(mul, new RowVector(2, 2, 2), Ep)); RowVector mur = 2 * r; Assert.True(RowVector.Equals(mur, new RowVector(2, 2, 2), Ep)); RowVector div = l / 2; Assert.True(RowVector.Equals(div, new RowVector(0.5, 0.5, 0.5), Ep)); }
public void Test_Equals() { Vector v = new Vector(1, 2, 3); RowVector rv = new RowVector(1, 2, 3); ColumnVector cv = new ColumnVector(1, 2, 3); // Vector.Equals �̓N���X�̋�ʂ���Ȃ� Assert.True(Vector.Equals(v, v, Ep)); Assert.True(Vector.Equals(v, rv, Ep)); Assert.True(Vector.Equals(v, cv, Ep)); //// RowVector.Equals �� RowVector ���m�̔�r�̂� //Assert.False(RowVector.Equals(rv, v, Ep)); //Assert.True(RowVector.Equals(rv, rv, Ep)); //Assert.False(RowVector.Equals(rv, cv, Ep)); //// ColumnVector.Equals �� ColumnVector ���m�̔�r�̂� //Assert.False(ColumnVector.Equals(cv, v, Ep)); //Assert.False(ColumnVector.Equals(cv, rv, Ep)); //Assert.True(ColumnVector.Equals(cv, cv, Ep)); }
/// <summary> /// 標準化された<see cref="RowVector"/>を作成する. /// </summary> /// <param name="vector">標準化される<see cref="RowVector"/>(実際は,この引数のコピーが標準化される)</param> /// <param name="varType">標準化に使用する分散の種類</param> /// <returns>標準化された<see cref="RowVector"/></returns> /// /// <exception cref="Exception.ValueIsLessThanLimitException"> /// 標準偏差値が設定されている精度の下限値未満の場合にthrowされる. /// </exception> public static RowVector Standardize(RowVector vector, VarianceType varType) { return(_Standardize_T(new RowVector(vector), varType)); }