public void Multiplication()
        {
            for (var i = 1; i < 10; i++)
            {
                for (var j = 1; j < 10; j++)
                {
                    for (var k = 1; k < 10; k++)
                    {
                        var data1 = TestData.GenerateTestDoubles(i * j, false, false, 7);
                        var data2 = TestData.GenerateTestDoubles(j * k, false, false, 19);

                        var m1 = MatrixFactory.Build(i, j, data1);
                        var m2 = MatrixFactory.Build(j, k, data2);

                        var m3 = m1 * m2;

                        Assert.IsNotNull(m3);
                        Assert.AreEqual(m3.Rows, i);
                        Assert.AreEqual(m3.Columns, k);

                        for (var r = 0; r < i; r++)
                        {
                            for (var c = 0; c < k; c++)
                            {
                                var value = m3[r, c];
                                var m1Row = m1.Row(r);
                                var m2Col = m2.Column(c);
                                Assert.AreEqual(value, m1Row.Dot(m2Col));
                            }
                        }
                    }
                }
            }
        }
        public void Addition()
        {
            for (var i = 1; i < 10; i++)
            {
                for (var j = 1; j < 10; j++)
                {
                    var data1 = TestData.GenerateTestDoubles(i * j, false, false, 7);
                    var data2 = TestData.GenerateTestDoubles(i * j, false, false, 19);

                    var m1 = MatrixFactory.Build(i, j, data1);
                    var m2 = MatrixFactory.Build(i, j, data2);

                    Assert.IsNotNull(m1);
                    Assert.IsNotNull(m2);
                    Assert.AreEqual(m1.Rows, i);
                    Assert.AreEqual(m1.Columns, j);
                    Assert.AreEqual(m2.Rows, i);
                    Assert.AreEqual(m2.Columns, j);

                    var m3 = m1 + m2;
                    var m4 = m2 + m1;

                    Assert.IsNotNull(m3);
                    Assert.IsNotNull(m4);
                    Assert.AreEqual(m3.Rows, i);
                    Assert.AreEqual(m3.Columns, j);
                    Assert.AreEqual(m4.Rows, i);
                    Assert.AreEqual(m4.Columns, j);
                    Assert.AreEqual(m3, m4);
                    Assert.IsFalse(ReferenceEquals(m3, m4));

                    for (var r = 0; r < i; r++)
                    {
                        for (var c = 0; c < j; c++)
                        {
                            var index = r * j + c;
                            var value = data1[index] + data2[index];
                            Assert.AreEqual(m3[r, c], value, 1e-9);
                        }
                    }
                }
            }
        }
        public void Scale()
        {
            for (var i = 1; i < 10; i++)
            {
                for (var j = 1; j < 10; j++)
                {
                    var data1 = TestData.GenerateTestDoubles(i * j, false, false, 7);
                    var data2 = TestData.GenerateTestDoubles(10, false, false, 19);

                    var m1 = MatrixFactory.Build(i, j, data1);

                    Assert.IsNotNull(m1);
                    Assert.AreEqual(m1.Rows, i);
                    Assert.AreEqual(m1.Columns, j);

                    for (var k = 0; k < data2.Length; k++)
                    {
                        var m2 = m1 * data2[k];
                        var m3 = data2[k] * m1;

                        Assert.IsNotNull(m2);
                        Assert.IsNotNull(m3);
                        Assert.AreEqual(m2.Rows, i);
                        Assert.AreEqual(m2.Columns, j);
                        Assert.AreEqual(m3.Rows, i);
                        Assert.AreEqual(m3.Columns, j);
                        Assert.AreEqual(m2, m3);
                        Assert.IsFalse(ReferenceEquals(m2, m3));

                        for (var r = 0; r < i; r++)
                        {
                            for (var c = 0; c < j; c++)
                            {
                                var index = r * j + c;
                                var value = data1[index] * data2[k];
                                Assert.AreEqual(m2[r, c], value, 1e-9);
                            }
                        }
                    }
                }
            }
        }
        public void Generation()
        {
            for (var i = 1; i < 10; i++)
            {
                // *** Square matrices ***
                var diagData        = TestData.GenerateTestDoubles(i);
                var diagonaleMatrix = MatrixFactory.Diagonal(diagData);
                Assert.IsTrue(diagonaleMatrix != null);
                Assert.IsTrue(diagonaleMatrix.Rows == i);
                Assert.IsTrue(diagonaleMatrix.Columns == i);

                var idMatrix = MatrixFactory.IdentityD(i, Math.PI);
                Assert.IsTrue(idMatrix != null);
                Assert.IsTrue(idMatrix.Rows == i);
                Assert.IsTrue(idMatrix.Columns == i);

                // Test square matrices
                for (var r = 0; r < i; r++)
                {
                    for (var c = 0; c < i; c++)
                    {
                        Assert.AreEqual(diagonaleMatrix[r, c], r == c ? diagData[r] : 0);
                        Assert.AreEqual(idMatrix[r, c], r == c ? Math.PI : 0, 1e-9);
                    }
                }

                // *** Non-square matrices ***
                for (var j = 1; j < 10; j++)
                {
                    var data   = TestData.GenerateTestDoubles(i * j);
                    var matrix = MatrixFactory.Build(i, j, data);

                    Assert.IsTrue(matrix != null);
                    Assert.IsTrue(matrix.Rows == i);
                    Assert.IsTrue(matrix.Columns == j);

                    var zeroMatrix = MatrixFactory.ZeroD(i, j);
                    Assert.IsTrue(zeroMatrix != null);
                    Assert.IsTrue(zeroMatrix.Rows == i);
                    Assert.IsTrue(zeroMatrix.Columns == j);

                    var oneMatrix = MatrixFactory.OneD(i, j, Math.PI);
                    Assert.IsTrue(oneMatrix != null);
                    Assert.IsTrue(oneMatrix.Rows == i);
                    Assert.IsTrue(oneMatrix.Columns == j);

                    if (i == 4 && j == 4)
                    {
                        Assert.IsInstanceOf(typeof(Matrix4x4d), matrix);
                    }

                    for (var r = 0; r < i; r++)
                    {
                        for (var c = 0; c < j; c++)
                        {
                            Assert.AreEqual(matrix[r, c], data[r * j + c], 1e-9);
                            Assert.AreEqual(zeroMatrix[r, c], 0, 1e-9);
                            Assert.AreEqual(oneMatrix[r, c], Math.PI, 1e-9);
                        }
                    }
                }
            }
        }