私は次の問題があります。大きな行列を同じサイズの小さなブロックに分割する方法があります。ブロック上でいくつかの操作を行った後、正しい順序で大きな行列を再構成したいのですが、何とか間違っています。ブロック全体の一覧 - java
次のコードは、2x2に分解する4x4行列を正しく再構成しますが、他の次元では正しく機能しません。
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;
}
私は行列を破るために使用される方法:
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;
}
私はそれをテスト方法:
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");
}
}
これは動作します:
testareMatBlo(4, 4, 2);
しかし、何かのdoesn 't。誰かが私が間違っていたことを説明できますか?
少数側ノート'' yuvMatrix.length'や 'yuvMatrix [0] .length'のようなものをすでに取得できているので、必要としない行列の次元を意味します(2次元を常に信頼できると仮定した場合、サイズ)。さらに、 'blockDimension'が行列の次元の要素であることを確認する必要があります。そうでなければ、それらをブロックに分解することが難しいかもしれません(例えば、5x5行列を2x2ブロックに分解する)。 – Thomas
ええ、私はすでにすべてを知っていましたが、私に思い出させてくれてありがとう。私は彼らが仕事をした後、メソッドをきれいにするつもりだった、今はちょっと混乱しています。 – Pred
あなたが '{blockToMatrix(...)'にコードがありません: 'long [] [] yuvBlock = blocks.get(i);' - 'i'はあなたが投稿したコードでは定義されていません。 – Thomas