public void Invert2Test() { var inverter = new SingleThreadedBlockMatrixInverter<double>(); var btm = new BlockTridiagonalMatrix<double>(3); var block11 = new Matrix<double>(4, 4); block11[1, 1] = 3; block11[1, 2] = 2; block11[1, 3] = 1; block11[1, 4] = 2; block11[2, 1] = 3; block11[2, 2] = 4; block11[2, 3] = 3; block11[2, 4] = 1; block11[3, 1] = 1; block11[3, 2] = 2; block11[3, 3] = 6; block11[3, 4] = 4; block11[4, 1] = 5; block11[4, 2] = 7; block11[4, 3] = 6; block11[4, 4] = 8; btm[1, 1] = block11; var block12 = new Matrix<double>(4, 2); block12[1, 1] = 10; block12[1, 2] = 5; block12[2, 1] = 5; block12[2, 2] = 20; block12[3, 1] = 1; block12[3, 2] = 2; block12[4, 1] = 3; block12[4, 2] = 4; btm[1, 2] = block12; var block21 = new Matrix<double>(2, 4); block21[1, 1] = 20; block21[1, 2] = 1; block21[1, 3] = 3; block21[1, 4] = 4; block21[2, 1] = 2; block21[2, 2] = 10; block21[2, 3] = 1; block21[2, 4] = 2; btm[2, 1] = block21; var block22 = new Matrix<double>(2, 2); block22[1, 1] = 7; block22[1, 2] = 2; block22[2, 1] = 2; block22[2, 2] = 8; btm[2, 2] = block22; var block23 = new Matrix<double>(2, 3); block23[1, 1] = 9; block23[1, 2] = 5; block23[1, 3] = 2; block23[2, 1] = 6; block23[2, 2] = 10; block23[2, 3] = 2; btm[2, 3] = block23; var block32 = new Matrix<double>(3, 2); block32[1, 1] = 6; block32[1, 2] = 4; block32[2, 1] = 1; block32[2, 2] = 2; block32[3, 1] = 8; block32[3, 2] = 3; btm[3, 2] = block32; var block33 = new Matrix<double>(3, 3); block33[1, 1] = 10; block33[1, 2] = 2; block33[1, 3] = 4; block33[2, 1] = 3; block33[2, 2] = 20; block33[2, 3] = 6; block33[3, 1] = 7; block33[3, 2] = 8; block33[3, 3] = 30; btm[3, 3] = block33; ///var tiled = btm.Tile(3); inverter.Invert(btm); //var btm = tiled.Untile(); MatrixHelpers.NotNaNOrInfinity(btm); // random spot testing of some of 81 results....... double delta = 0.0001; Assert.AreEqual(-0.0065, btm[1, 1][1, 1], delta); Assert.AreEqual(0.0497, btm[1, 1][2, 1], delta); Assert.AreEqual(-0.0422, btm[1, 1][2, 2], delta); Assert.AreEqual(0.0645, btm[1, 1][2, 3], delta); Assert.AreEqual(0.0555, btm[1, 2][1, 1], delta); Assert.AreEqual(0.1474, btm[1, 2][2, 2], delta); Assert.AreEqual(0.0823, btm[1, 2][3, 2], delta); Assert.AreEqual(-0.0485, btm[1, 2][4, 1], delta); Assert.AreEqual(0.1288, btm[2, 1][1, 1], delta); Assert.AreEqual(0.0468, btm[2, 1][1, 3], delta); Assert.AreEqual(-0.0635, btm[2, 1][2, 3], delta); Assert.AreEqual(0.0479, btm[2, 1][2, 4], delta); Assert.AreEqual(-0.0053, btm[2, 2][1, 1], delta); Assert.AreEqual(0.0146, btm[2, 2][1, 2], delta); Assert.AreEqual(-0.0086, btm[2, 2][2, 1], delta); Assert.AreEqual(-0.0381, btm[2, 2][2, 2], delta); Assert.AreEqual(-0.0046, btm[2, 3][2, 3], delta); Assert.AreEqual(0.0028, btm[3, 2][2, 2], delta); Assert.AreEqual(-0.0124, btm[3, 3][1, 3], delta); }
public static IEnumerable<Measurement> BlockInverse() { yield return new BlockTridiagonalMatrixMeasurement { Execute = (btm, ts, _) => { var inverter = new SingleThreadedBlockMatrixInverter<double>(); inverter.Invert(btm); } }; }