J'ai donc le problème suivant: J'ai une méthode qui casse une grande matrice en blocs plus petits de la même taille. Après avoir fait quelques opérations sur les blocs, je veux reconstruire la grande matrice dans le bon ordre, mais je me trompe d'une manière ou d'une autre.Liste des blocs à une matrice entière - java
Le code suivant reconstruit correctement une matrice 4x4 qui se divise en 2x2, mais pour toutes les autres dimensions, cela ne fonctionne pas correctement.
public long[][] blocksToMatrix(List<long[][]> blocks, int blockDimension, int width, int height){
long[][] yuvMatrix = new long[height][width];
int heightPos = 0;
int widthPos = 0;
for (int i = 0; i < blocks.size(); i++) {
long[][] yuvBlock = blocks.get(i);
int heightPosTemp = heightPos;
for (int j = 0; j < blockDimension * blockDimension; j++) {
yuvMatrix[heightPos][widthPos] = yuvBlock[j/blockDimension][j % blockDimension];
widthPos++;
if (widthPos >= width){
widthPos = (i * blockDimension) % width;
heightPos++;
}
if (widthPos == ((i + 1) * blockDimension) % width){
widthPos = (i * blockDimension) % width;
heightPos++;
}
}
if (heightPos == height){
heightPos = heightPosTemp;
}
else {
heightPos = (i * blockDimension) % height;
}
widthPos = ((i + 1) * blockDimension) % width;
}
return yuvMatrix;
}
La méthode que je cassais la matrice:
public List<long[][]> matrixToBlocks(long[][] yuvMatrix, int blockDimension, int width, int height){
int blocksSize = width/blockDimension * (height/blockDimension);
List<long[][]> blocks = new ArrayList<long[][]>();
for (int i = 0; i < blocksSize; i++) {
long[][] subBlock = new long[blockDimension][blockDimension];
int heightPos = (blockDimension * (i/blockDimension)) % height;
int widthPos = (blockDimension * i) % width;
if (widthPos + blockDimension > width) {
widthPos = 0;
}
for (int row = 0; row < blockDimension; row++) {
for (int col = 0; col < blockDimension; col++) {
subBlock[row][col] = yuvMatrix[heightPos + row][col + widthPos];
}
}
blocks.add(subBlock);
}
return blocks;
}
La façon dont je l'ai testé:
public static void testareMatBlo(int height, int width, int blockdim){
long[][] test = new long[height][width];
int val = 1;
for (int i = 0; i < height; i++){
for (int j = 0; j < width; j++){
test[i][j] = val;
val++;
}
}
List<long[][]> blocks = matrixToBlocks(test, blockdim, width, height);
long[][] matrix = blocksToMatrix(blocks, blockdim, width, height);
if (Arrays.deepEquals(test, matrix)){
System.out.println("YES");
}
else {
System.out.println("NO");
}
}
Cela fonctionne:
testareMatBlo(4, 4, 2);
Mais quoi que ce soit d'autre doesn 't. Quelqu'un peut-il expliquer ce que j'ai fait de mal?
quelques remarques secondaires sur 'matrixToBlocks (longue [] [] yuvMatrix, int blockDimension, largeur int, int hauteur)' (et 'blocksToMatrix (...)'): en supposant que 'width' et' hauteur 'signifie les dimensions de la matrice dont vous pourriez ne pas avoir besoin, puisque vous pouvez déjà les obtenir comme 'yuvMatrix.length' et' yuvMatrix [0] .length' (en supposant que vous pouvez faire confiance à la 2ème dimension a toujours le même Taille). De plus, vous devez vous assurer que 'blockDimension' est un facteur des dimensions de la matrice, sinon vous pourriez avoir des difficultés à les décomposer en blocs (par exemple décomposer une matrice 5x5 en blocs 2x2). – Thomas
Ouais, je savais déjà tout ça, mais merci de me le rappeler ... J'allais nettoyer les méthodes après les avoir fait travailler, en ce moment elles sont un peu en désordre. – Pred
You'r 'blocksToMatrix (...)' manque un code: 'long [] [] yuvBlock = blocks.get (i);' - 'i' n'est pas défini dans le code que vous avez posté. – Thomas