将Java 2D数组(4x4)拆分为较小的数组(2x2)并再次合并

将Java 2D数组(4x4)拆分为较小的数组(2x2)并再次合并,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,此源代码将4x4数组拆分为2x2的数组。。。 如何将2x2数组的值恢复为4x4数组 public class testmatriks { private static Random generator = new Random(); public static void main(String[] args) { double[][] mainArray = new double[4][4]; double[][] subArray = new

此源代码将4x4数组拆分为2x2的数组。。。 如何将2x2数组的值恢复为4x4数组

public class testmatriks {
    private static Random generator = new Random();

    public static void main(String[] args) {
        double[][] mainArray = new double[4][4];
        double[][] subArray = new double[2][2];
        double[][] rubArray = new double[4][4];
        int value;
        for (int i = 0; i < mainArray.length; i++) {
            for (int j = 0; j < mainArray[0].length; j++) {
                value = generator.nextInt(255);
                mainArray[i][j] = value;
                System.out.print(mainArray[i][j] + "  ");
            }
            System.out.println("");
        }
        System.out.println("\n");
        System.out.println("pecah ke piksel 2x2 piksel");

        for (int row = 0; row < (mainArray.length); row += 2) {
            for (int column = 0; column < mainArray[0].length; column += 2) {
                for (int k = 0; k < 2; k++) {
                    for (int l = 0; l < 2; l++) {
                        subArray[k][l] = mainArray[row + k][column + l] * 2;
                        System.out.print(subArray[k][l] + " ");
                    }
                    System.out.println(" ");
                }
            }
        }
    }
}
公共类testmatriks{
专用静态随机生成器=新随机();
公共静态void main(字符串[]args){
double[]mainArray=新的双精度[4][4];
双精度[]子阵列=新的双精度[2][2];
double[]rubArray=新的double[4][4];
int值;
对于(int i=0;i


这张图片说明了我想要什么。

这是您最初在4x4阵列中拥有的:

[a1 | b1 | c1 | d1]
[a2 | b2 | c2 | d2]
[a3 | b3 | c3 | d3]
[a4 | b4 | c4 | d4]

这是您创建的2x2阵列中的内容:

[2*c3 | 2*d3]
[2*c4 | 2*d4]

当您说“还原”时,不清楚该4x4数组中的值放置在何处,因此我将只使用用于创建2x2的4x4中的位置:

守则:

for (int r = 0; r < 2; r++) {
    for (int c = 0; c < 2; c++) {
        mainArray[r + 2][c + 2] = subArray[r][c];
    }
}
for(int r=0;r<2;r++){
对于(int c=0;c<2;c++){
主阵列[r+2][c+2]=子阵列[r][c];
}
}
这应该是代码运行后的内容:

[a1 | b1 | c1 | d1]
[a2 | b2 | c2 | d2]
[a3 | b3 | c3+c3 | d3+d3]
[a4 | b4 | c4+c4 | d4+d4]


为了将数组分割成更小的块,我想到了以下方法:

/**
* @param larger the larger array to be split into sub arrays of size chunksize
* @param chunksize the size of each sub array
* @precond chunksize > 0 && larger != null
* @throws ArrayIndexOutOfBoundsException, NullPointerException
*/
public static List<double[][]> chunks(double [][]larger, int chunksize) throws 
    ArrayIndexOutOfBoundsException, NullPointerException  {
    if (chunksize <= 0)
        throw new ArrayIndexOutOfBoundsException("Chunks must be atleast 1x1");
    int size = larger.length / chunksize * (larger[0].length / chunksize);
    List<double[][]> subArrays = new ArrayList<>();

    for (int c = 0; c < size; c++) {
        double[][] sub = new double[chunksize][chunksize];
        int startx = (chunksize * (c / chunksize)) % larger.length;
        int starty = (chunksize * c) % larger[0].length;

        if (starty + chunksize > larger[0].length) {
            starty = 0;
        }

        for (int row = 0; row < chunksize; row++) {
            for (int col = 0; col < chunksize; col++) {
                sub[row][col] = larger[startx + row][col + starty];
            }
        }
        subArrays.add(sub);
    }

    return subArrays;
}
/**
*@param large要拆分为大小为chunksize的子数组的较大数组
*@param chunksize每个子数组的大小
*@precd chunksize>0&更大!=无效的
*@抛出ArrayIndexOutOfBoundsException,NullPointerException
*/
公共静态列表块(双[][]大,int chunksize)抛出
ArrayIndexOutOfBoundsException,NullPointerException{
if(chunksize大于[0]。长度){
starty=0;
}
for(int row=0;row
我还没有对它进行测试,但是您可以使用已有的代码轻松地进行测试

示例用法:

所以您有一个4x4数组,您将其拆分为一个2x2(那么您将丢失1/4的值?),并且您希望重新创建为一个4x4?看起来您的子数组完全为主数组的每个块重新写入自身。我看到行=0,列=0,然后遍历子数组的每个部分(k,l),然后用主数组的1/4覆盖整个子数组。主数组的第二次迭代(其中行=0,列=2)您将再次将整个内容写入子数组,并销毁之前提供的值。简言之,您将需要4个子数组(或某种智能方式将4个唯一的数字组合成1,以便可以再次放回)来存储该数据,然后稍后检索该数据。在第二种情况下,您可以使用一些技巧将0到255之间的多个数字放入“double”数据类型中。上面的sourcecode只是一个示例!!我实际上把它应用到了DCT方法的需要上!!!DCT的工作原理是将整个阵列分解为8x8大小的块。经过8x8大小的块和逆变换后。在相位矩阵阵列返回到阵列的实际大小后,在这种情况下不会再次形成8x8!!!请帮助上面的源代码只是一个示例!!我实际上把它应用到了DCT方法的需要上!!!DCT的工作原理是将整个阵列分解为8x8大小的块。经过8x8大小的块和逆变换后。在相位矩阵阵列返回到阵列的实际大小后,在这种情况下不会再次形成8x8!!!如果这就是你想要做的,请帮助,然后用一个新的问题陈述这个问题,我相信有人会看一看并纠正你的错误。对不起,我不明白,建议我加入这个小组为什么if子数组[0][0]执行数组c3中的数字。。。?为什么数组a1中出现的数字不…?您最初的问题已更改。这是因为你现在问的是关于DCT的问题,这个问题与你开始写的文章是关于什么的问题非常不同。所以我的建议是开始一篇新的文章,标题是DCT,并给出一个你的问题是什么的示例代码,然后一些人会帮助你