public virtual Matrix <double> Jacobian(Vector <double> x)
        {
            var output = new LinearAlgebra.Double.DenseMatrix(this.ItemDimension, this.ParameterDimension);

            this.JacobianbyRef(x, output);
            return(output);
        }
        public virtual Matrix <double> ItemHessian(Vector <double> x, int itemIndex)
        {
            var output = new LinearAlgebra.Double.DenseMatrix(this.ParameterDimension, this.ParameterDimension);

            this.ItemHessianByRef(x, itemIndex, output);
            return(output);
        }
        public virtual void SsqHessianByRef(Vector <double> x, Matrix <double> output)
        {
            if (output.RowCount != this.ParameterDimension || output.ColumnCount != this.ParameterDimension)
            {
                throw new ArgumentException($"Output matrix must match parameter dimension of function; expected {this.ParameterDimension}x{this.ParameterDimension}, got {output.RowCount}x{output.ColumnCount}.");
            }

            for (int ii = 0; ii < this.ParameterDimension; ++ii)
            {
                for (int jj = 0; jj < this.ParameterDimension; ++jj)
                {
                    output[ii, jj] = 0.0;
                }
            }

            var    tmp_grad  = new LinearAlgebra.Double.DenseVector(this.ParameterDimension);
            var    tmp_hess  = new LinearAlgebra.Double.DenseMatrix(this.ParameterDimension, this.ParameterDimension);
            double tmp_value = 0.0;

            for (int ii = 0; ii < this.ItemDimension; ++ii)
            {
                tmp_value = this.ItemValue(x, ii);
                this.ItemGradientByRef(x, ii, tmp_grad);
                this.ItemHessianByRef(x, ii, tmp_hess);
                for (int jj = 0; jj < this.ParameterDimension; ++jj)
                {
                    for (int kk = 0; kk < this.ParameterDimension; ++kk)
                    {
                        var increment = 2 * (tmp_value * tmp_hess[jj, kk] + tmp_grad[jj] * tmp_grad[kk]);
                        output[jj, kk] += increment;
                    }
                }
            }
        }
Example #4
0
        public void CanWriteDoubleMatrices()
        {
            var mat1 = new LinearAlgebra.Double.DenseMatrix(5, 3);

            for (var i = 0; i < mat1.ColumnCount; i++)
            {
                mat1[i, i] = i + .1;
            }

            var mat2 = new LinearAlgebra.Double.DenseMatrix(4, 5);

            for (var i = 0; i < mat2.RowCount; i++)
            {
                mat2[i, i] = i + .1;
            }

            var mat3 = new LinearAlgebra.Double.SparseMatrix(5, 4);

            mat3[0, 0] = 1.1;
            mat3[0, 2] = 2.2;
            mat3[4, 3] = 3.3;

            var mat4 = new LinearAlgebra.Double.SparseMatrix(3, 5);

            mat4[0, 0] = 1.1;
            mat4[0, 2] = 2.2;
            mat4[2, 4] = 3.3;

            var write = new LinearAlgebra.Double.Matrix[] { mat1, mat2, mat3, mat4 };

            var names = new[] { "mat1", "dense_matrix_2", "s1", "sparse2" };

            if (File.Exists("testd.mat"))
            {
                File.Delete("testd.mat");
            }

            var writer = new MatlabMatrixWriter("testd.mat");

            writer.WriteMatrices(write, names);
            writer.Dispose();

            var reader = new MatlabMatrixReader <double>("testd.mat");
            var read   = reader.ReadMatrices(names);

            Assert.AreEqual(write.Length, read.Count);

            for (var i = 0; i < write.Length; i++)
            {
                var w = write[i];
                var r = read[names[i]];

                Assert.AreEqual(w.RowCount, r.RowCount);
                Assert.AreEqual(w.ColumnCount, r.ColumnCount);
                Assert.IsTrue(w.Equals(r));
            }
        }
        public void CanWriteDoubleMatrices()
        {
            var mat1 = new LinearAlgebra.Double.DenseMatrix(5, 3);
            for (var i = 0; i < mat1.ColumnCount; i++)
            {
                mat1[i, i] = i + .1;
            }

            var mat2 = new LinearAlgebra.Double.DenseMatrix(4, 5);
            for (var i = 0; i < mat2.RowCount; i++)
            {
                mat2[i, i] = i + .1;
            }

            var mat3 = new LinearAlgebra.Double.SparseMatrix(5, 4);
            mat3[0, 0] = 1.1;
            mat3[0, 2] = 2.2;
            mat3[4, 3] = 3.3;

            var mat4 = new LinearAlgebra.Double.SparseMatrix(3, 5);
            mat4[0, 0] = 1.1;
            mat4[0, 2] = 2.2;
            mat4[2, 4] = 3.3;

            var write = new LinearAlgebra.Double.Matrix[] { mat1, mat2, mat3, mat4 };

            var names = new[] { "mat1", "dense_matrix_2", "s1", "sparse2" };
            if (File.Exists("testd.mat"))
            {
                File.Delete("testd.mat");
            }

            var writer = new MatlabMatrixWriter("testd.mat");
            writer.WriteMatrices(write, names);
            writer.Dispose();

            var reader = new MatlabMatrixReader<double>("testd.mat");
            var read = reader.ReadMatrices(names);

            Assert.AreEqual(write.Length, read.Count);

            for (var i = 0; i < write.Length; i++)
            {
                var w = write[i];
                var r = read[names[i]];

                Assert.AreEqual(w.RowCount, r.RowCount);
                Assert.AreEqual(w.ColumnCount, r.ColumnCount);
                Assert.IsTrue(w.Equals(r));
            }
        }