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; } } } }
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)); } }