public void CreateMatrixUsingStrings() { Matrix matrix = new Matrix("1000", "0100", "0010", "0001"); Assert.AreEqual(4, matrix.Width); Assert.AreEqual(4, matrix.Height); for (int x = 0; x < 4; x++) for (int y = 0; y < 4; y++) if (x == y) Assert.IsTrue(matrix.Get(x, y)); else Assert.IsFalse(matrix.Get(x, y)); }
public void CreateEmptyMatrix() { Matrix matrix = new Matrix(3, 4); Assert.AreEqual(3, matrix.Width); Assert.AreEqual(4, matrix.Height); for (int x = 0; x < 3; x++) for (int y = 0; y < 4; y++) Assert.IsFalse(matrix.Get(x, y)); }
/* NOTA GENERALE. I metodi precedenti, steepest descent, rilassamento (per la scelta delle direzioni) e passo fisso e bisezione (per la ricerca del minimo (o del massimo) non sono sufficienti da soli. E' ragionevole scrivere prima alcune funzioni che lavorino separatamente. Tutte sono incluse nella classe Fmin e hanno gia` implicito il delegate alla funzione Tutte devono prima verificare che il delegate non sia nullo. */ /// <summary> /// Ricerca per punti /// </summary> /// <param name="xk">Punto centrale</param> /// <param name="range">Meta` ampiezza di ricerca (ammessi valori nulli)</param> /// <param name="passiU">Numero di passi unilaterali (almeno 1)</param> /// <param name="xmin">Punto con il valore minore</param> /// <param name="cicli">Numero di punti calcolati</param> /// <returns></returns> public bool Campionamento( Matrix xk, Matrix range, MatrixBase<int> passiU, ref Matrix xmin, ref int cicli) { bool found = false; int n; // Dimensioni dei vettori int i; // Contatore n = xk.Row; if((range.Row != n) || (passiU.Row != n) || (xmin.Row != n) || (xk.Col != 1) || (range.Col != 1) || (passiU.Col != 1) || (xmin.Col != 1) ) { return found; // Verifica indici } for(i=0; i<n; i++) // Verifica intervalli (ammessi valori nulli) { if(range.Get(i,0) < 0.0) { return found; } } for(i=0; i<n; i++) // Verifica passi (almeno 1 per lato) { if(passiU.Get(i,0) < 1) { return found; } } MatrixBase<int> passi = new MatrixBase<int>(n,1); // Matrice dei passi for(i=0; i<n; i++) // Calcola i passi effettivi (segmenti, non punti) { passi.Set(i, 0, passiU.Get(i,0) * 2); } Matrix step = new Matrix(n,1); for(i=0; i<n; i++) // Calcola i passi effettivi { step.Set(i, 0, range.Get(i,0)/passi.Get(i,0)); } Matrix xo = new Matrix(n,1); for(i=0; i<n; i++) // Calcola i punti di partenza { xo.Set(i, 0, xk.Get(i,0) - step.Get(i,0) * passiU.Get(i,0)); } MatrixBase<int> contatori = new MatrixBase<int>(n,1,0); // Vettore dei contatotri (tutti a 0) Matrix x = new Matrix(n,1); // Vettore dei valori effettivi int iinc = -1; double minimo = double.MaxValue; double f; cicli = 0; bool fine = false; while(!fine) { if(iinc >= 0) // ricalcola nuovo vettore x { x.Set( iinc,0, xo.Get(iinc,0) + step.Get(iinc,0) * contatori.Get(iinc,0) ); } else { for(i=0; i<n; i++) x.Set( i,0, xo.Get(i,0) + step.Get(i,0) * contatori.Get(i,0) ); } f = Funzione(x); // Calcola la f del punto x attuale if(f < minimo) // Vede se e` minima (rispetto ai valori trovati finora) { minimo = f; xmin = x.Copy(); found = true; } fine = !Incrementa(ref contatori, passi, ref iinc); cicli++; } return found; }
public void SetCells() { Matrix matrix = new Matrix(3, 3); matrix.Set(0, 0, true); matrix.Set(1, 1, true); matrix.Set(2, 2, true); for (int x = 0; x < 3; x++) for (int y = 0; y < 3; y++) if (x == y) Assert.IsTrue(matrix.Get(x, y)); else Assert.IsFalse(matrix.Get(x, y)); }
/// <summary> /// Trasforma da coordinate omogenee a Point2D /// </summary> /// <param name="pth"></param> /// <returns></returns> public static Point2D Convert(Matrix pth) { Point2D pt = new Point2D(); for(int i=0; i<Point2D.Dim2D; i++) pt.Set(i,0,pth.Get(i,0)); return pt; }