private void _btnCalc_Click(object sender, EventArgs e) { IMatrix matrix = new MathnetMatrixSolver(); Stopwatch stopwatch = new Stopwatch(); string formulaA = _tbAformula.Text, formulaB = _tbBformula.Text; int columnA = Convert.ToInt32(_tbAcolumn.Text), rowA = Convert.ToInt32(_tbArow.Text); int columnB = Convert.ToInt32(_tbBcolumn.Text), rowB = Convert.ToInt32(_tbBrow.Text); bool sparse = _chbSparseA.Checked && _chbSparseB.Checked; int opp = _cmbbOpperation.SelectedIndex; Cursor.Current = Cursors.WaitCursor; stopwatch.Start(); double[,] m = matrix.ParsedSolve(formulaA, formulaB, columnA, rowA, columnB, rowB, sparse, opp); stopwatch.Stop(); _rtbDialog.Text = "Время вычисления: " + stopwatch.ElapsedMilliseconds.ToString() + "милисекунд\n"; for (int i = 0; i < 5 && i < m.GetLength(0); i++) { for (int j = 0; j < 5 && j < m.GetLength(1); j++) { _rtbDialog.Text += m[i, j] + " "; } _rtbDialog.Text += "\n"; } Cursor.Current = Cursors.Default; }
public double[,] ParsedSolve(string formulaA, string formulaB, int columnA, int rowA, int columnB, int rowB, bool sparse, int opperation) { SymbolicExpression parsedA = SymbolicExpression.Parse(formulaA); SymbolicExpression parsedB = SymbolicExpression.Parse(formulaB); if (parsedA != null && parsedB != null) { Stopwatch stopwatch = new Stopwatch(); Matrix <double> mA, mB; Func <double, double, double> funcA = parsedA.Compile("x", "y"); Func <double, double, double> funcB = parsedB.Compile("x", "y"); IMatrix matrix = new MathnetMatrixSolver(); switch (opperation) { case 0: { if (!sparse) { mA = Matrix <double> .Build.Dense(columnA, rowA, (i, j) => funcA(i, j)); mB = Matrix <double> .Build.Dense(columnB, rowB, (i, j) => funcB(i, j)); return((mA * mB).ToArray()); } mA = Matrix <double> .Build.Sparse(columnA, rowA, (i, j) => funcA(i, j)); mB = Matrix <double> .Build.Sparse(columnB, rowB, (i, j) => funcB(i, j)); return((mA * mB).ToArray()); } case 1: { if (!sparse) { mA = Matrix <double> .Build.Dense(columnA, rowA, (i, j) => funcA(i, j)).Transpose(); return(mA.ToArray()); } mA = Matrix <double> .Build.Sparse(columnA, rowA, (i, j) => funcA(i, j)).Transpose(); return(mA.ToArray()); } } } double[,] err = { { 0.0 } }; return(err); }
public void TestLargeMultiply() { IMatrix matrix = new MathnetMatrixSolver(); string formulaA = "1", formulaB = "x+y"; int columnA = 100, rowA = 100; int columnB = 100, rowB = 100; bool sparse = false; int opp = 0; bool testComplete = true; double[,] m = matrix.ParsedSolve(formulaA, formulaB, columnA, rowA, columnB, rowB, sparse, opp); for (int i = 0; i < columnA; i++) { for (int j = 0; j < rowB; j++) { if (m[i, j] != 4950 + j * 100) { testComplete = false; } } } Assert.True(testComplete); }
public void TestTransponse() { IMatrix matrix = new MathnetMatrixSolver(); string formulaA = "x*2", formulaB = "y*3"; int columnA = 100, rowA = 100; int columnB = 100, rowB = 100; bool sparse = false; int opp = 1; bool testComplete = true; double[,] m = matrix.ParsedSolve(formulaA, formulaB, columnA, rowA, columnB, rowB, sparse, opp); for (int i = 0; i < columnA; i++) { for (int j = 0; j < rowA; j++) { if (m[i, j] != j * 2) { testComplete = false; } } } Assert.True(testComplete); }