在JAVA中将大型数组拆分为较小的数组

时间:2014-09-30 17:13:29

标签: java arrays matlab

我有一个双像素图像像素,其大小取决于图像大小。让我们说图像是1000x1334,我将有一个carryOutput [1000] [1334]双数组。

我需要在以下条件下将数组分解为更小的double [9] [9]数组。我为它创建了一个for循环但是被卡住了一半。

//smaller array z    
double[][] z = new double[9][9];

     for(int length = 0; length < carryOutput.length; length+=8)
     {
         for(int width = 0; width < carryOutput[0].length; width+=8)
         {
             ... code to fill in z array here ....
         }
     }

基本上,我希望根据for循环中的条件,有多个较小的数组作为carryOutput的子数组。

EG: length = 0, width = 0 --> z[0][0] until z[8][8] = carryOutput[0][0] until carryOutput [8][8]
    length = 0, width = 8 --> z[0][0] until z[8][8] = carryOutput[0][9] until carryOutput [8][17]
    ....

这里的问题是有一种方法可以避免分解成许多数组。你看,如果它是1000x1000的图像,那么将有大约100个更小的阵列。

我有一个正在运行的MATLAB代码,它实际上完成了这项工作。我试图将其翻译成JAVA。

附件是MATLAB代码的一部分:

      e = size(carryOutput);
        for length=1:8:e(1)-8;
            for wide=1:8:e(2)-8;

                z=coef(length:length+8,wide:wide+8);
        ...

    row = 1;
    col = 2;   

            if (z(row,col) < z(row,col+1))
                    smaller = smaller+1;  
                if z(row,col+2) > z(row,col+1)
                smaller_plus = smaller_plus+1;
                else if z(row,col+2) < z(row,col+1)
                smaller_minus = smaller_minus +1;
                else if z(row,col+2) == z(row,col+1)
                smaller_static = smaller_static +1;
                end;end;end;

....

我想要输出类似于MATLAB的原因,因为我必须在代码中稍后比较每个较小数组的行和列。编写代码来比较100个不同的数组会很麻烦。

任何人都可以强调我的代码应该如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

你的应用是如何被卡住的?如果数组大小非常大,则可能在垃圾收集中。我不会关心分裂数组。相反,我建议将堆添加到java运行时:

java -Xms1g -Xmx1g ...

答案 1 :(得分:0)

我认为您无法创建100多个较小的阵列,但有一些优化可以让您的代码运行得更快。例如,您可以使用System.arrayCopy()方法而不是内部for循环来更快地移动数据。

您还提到了这些较小数组的目的是相互比较,因此您可以做的一个巨大的优化是存储一些关于其内容的散列信息(例如9x9字节的CRC32)并使用这些散列值以确定两个9x9数组是否不同,而不必迭代81个字节。

相关问题