Quindi ho chiamato un oggetto, per mancanza di una parola migliore, MatricesMatrix
che è un Matrix
di Matrici (tutto è memorizzato come double[,]
). Voglio rimuovere tutti i valori dalle matrici interne in un'unica grande matrice. Ecco quello che ho finora:Conversione di una matrice 2D di array 2D in una singola matrice 2D
public Matrix ConvertToMatrix()
{
//Figure out how big the return matrix should be
int totalRows = this.TotalRows();
int totalColumns = this.TotalColumns();
Matrix returnMatrix = new Matrix(totalRows, totalColumns);
List<object> rowElementsList = new List<object>();
//"outer" index means an index of the MatricesMatrix
//"inner" index means an index of a Matrix within the Matrices Matrix
//outer row loop
for (int outerRowIndex = 0; outerRowIndex < NumberOfRows; outerRowIndex++)
{
//outer column loop
for (int outerColumnIndex = 0; outerColumnIndex < NumberOfColumns; outerColumnIndex++)
{
Matrix currentMatrix = GetElement(outerRowIndex, outerColumnIndex);
object element = null;
//inner row loop
for (int innerRowIndex = 0; innerRowIndex < currentMatrix.NumberOfRows; innerRowIndex++)
{
//inner column loop
for (int innerColumnIndex = 0; innerColumnIndex < currentMatrix.NumberOfColumns; innerColumnIndex++)
{
element = currentMatrix.GetElement(innerRowIndex, innerColumnIndex);
}
}
returnMatrix.SetElement(outerRowIndex, outerColumnIndex, (double)element);
}
}
return returnMatrix;
}
Si noti che ho deciso di codice il numero totale di righe e colonne della returnMatrix deve avere.
Ecco altre linee guida e casi uscita:
- Ogni elemento del grande matrice deve essere nella stessa posizione rispetto agli altri elementi del grande matrice che provenivano dalla matrice interna MatricesMatrix che la l'elemento è venuto da.
- Ogni "matrice" (non più in forma di matrice) all'interno della matrice grande deve essere nella stessa posizione rispetto alle altre matrici all'interno della matrice grande come era all'interno della matrice Matrici (senza sovrapposizione e 0 in eventuali spazi lasciati vuoti).
CASO 1
Dato questo ingresso: un MatricesMatrix(2,2)
con [0,0] = (2x2 matrix), [0,1] = (2x3 matrix), [1,0] = (2x2 matrix), and [1,1] = (2x3 matrix)
. Cioè,
uscita deve essere:
CASO 2
Dato questo ingresso: un MatricesMatrix(2,2)
con [0,0] = (1x1 matrix), [0,1] = (3x3 matrix), [1,0] = (2x2 matrix), and [1,1] = (4x4 matrix)
. Cioè,
uscita dovrebbe essere qualcosa di simile:
Tutta l'assistenza sarebbe molto apprezzato!
UPDATE: Ecco un test di unità per il caso 1, che deve trascorrere:
[TestMethod]
public void MatricesMatrix_ConvertToMatrixTest()
{
Matrix m1 = new Matrix(2);
Matrix m2 = new Matrix(2, 3);
Matrix m3 = new Matrix(2);
Matrix m4 = new Matrix(2, 3);
double[] m1Row1 = { 1, 1 };
double[] m1Row2 = { 1, 1 };
double[] m2Row1 = { 2, 2, 2 };
double[] m2Row2 = { 2, 2, 2 };
double[] m3Row1 = { 3, 3 };
double[] m3Row2 = { 3, 3 };
double[] m4Row1 = { 4, 4, 4 };
double[] m4Row2 = { 4, 4, 4 };
m1.SetRowOfMatrix(0, m1Row1);
m1.SetRowOfMatrix(1, m1Row2);
m2.SetRowOfMatrix(0, m2Row1);
m2.SetRowOfMatrix(1, m2Row2);
m3.SetRowOfMatrix(0, m3Row1);
m3.SetRowOfMatrix(1, m3Row2);
m4.SetRowOfMatrix(0, m4Row1);
m4.SetRowOfMatrix(1, m4Row2);
MatricesMatrix testMatricesMatrix = new MatricesMatrix(2, 2);
testMatricesMatrix.SetElement(0, 0, m1);
testMatricesMatrix.SetElement(0, 1, m2);
testMatricesMatrix.SetElement(1, 0, m3);
testMatricesMatrix.SetElement(1, 1, m4);
Matrix expectedResult = new Matrix(4, 5);
double[] expectedRow1 = { 1, 1, 2, 2, 2 };
double[] expectedRow2 = { 1, 1, 2, 2, 2 };
double[] expectedRow3 = { 3, 3, 4, 4, 4 };
double[] expectedRow4 = { 3, 3, 4, 4, 4 };
expectedResult.SetRowOfMatrix(0, expectedRow1);
expectedResult.SetRowOfMatrix(1, expectedRow2);
expectedResult.SetRowOfMatrix(2, expectedRow3);
expectedResult.SetRowOfMatrix(3, expectedRow4);
Matrix actualResult = testMatricesMatrix.ConvertToMatrix();
(actualResult == expectedResult).Should().BeTrue();
}
è accettabile se si sposta 2x2 matrice superiore di due blocchi e si sposta 3x3 matrice a sinistra di 1 blocco? – Dimitri
Intendi spostare il 3x3 sul blocco RIGHT 1? Sì, penso che sia una possibilità fintanto che il metodo può ancora gestire MatricesMatrix più grande rispetto all'esempio che ho dato –
Non sono sicuro di quali criteri debba essere superata la soluzione. Quello che mostri è afaics non la più piccola matrice 2d che potrebbe contenere quelle più piccole senza sovrapposizioni. Quindi si potevano sistemarli allineati l'uno sotto l'altro, no? –