сгенерировать 2d-массив, который можно использовать для создания изображения с помощью Java

Этот код Python

im_data = np.ones((100,100))
im_data[20:50,20:50]=np.zeros((30,30))

может сгенерировать 2d-массив, который можно использовать для создания изображения

plt.axis('off')
axi = plt.imshow(im_data, cmap='Greys')

введите описание изображения здесь

Я пытаюсь проделать то же самое с Java

class Arr100{
    public static void main(String[] args){
        System.out.println("H");
        int[][] arr = new int[100][100];
        for(int i=0; i<arr.length; i++){
            for (int j=0; j<arr[i].length; j++){
                arr[i][j]=1;
            }
        }
        for(int i=20; i<50; i++){
            for (int j=20; j<50; j++){
                arr[i][j]=0;
            }
        }
    }
}

Что касается графического процессора и памяти, есть ли лучший способ сделать то же самое?

1 ответ
1

Вам не нужно вручную управлять вложенными for петли.

int[][] pixels = new int[100][100];
for (int[] row : pixels) {
    Arrays.fill(row, 1);
}

for (int i = 20; i < 50; i++) {
    Arrays.fill(pixels[i], 20, 50, 0);
}

Это позволит лучше использовать оптимизацию, доступную для управления значениями массива.

Мне лично не нравится arr как имя для массива. Если мне нужно общее имя, я обычно использую data. я использовал pixels здесь. Или же colors должно сработать.

Это может быть более или менее эффективно, чем

int[][] pixels = new int[100][100];
int i = 0;
for (; i < 20; i++) {
    Arrays.fill(pixels[i], 1);
}
for (; i < 50; i++) {
    Arrays.fill(pixels[i], 0, 20, 1);
    Arrays.fill(pixels[i], 50, pixels[i].length, 1);
}
for (; i < pixels.length; i++) {
    Arrays.fill(pixels[i], 1);
}

Это не устанавливает ни один из пикселей дважды и полагается на значения по умолчанию для пикселей 0. Это может быть более эффективным. Хотя также возможно, что проще установить для всего массива одно значение, чем работать со строками и частями строк.

Обратите внимание: если вы хотите изменить представление, тогда

int[][] pixels = new int[100][100];
for (int i = 20; i < 50; i++) {
    Arrays.fill(pixels[i], 20, 50, 1);
}

вероятно, было бы лучше, чем то и другое. В этом случае черный — это 0 по умолчанию, а 1 — белый квадрат.

Третья форма — это наименьшее количество кода и, вероятно, самая быстрая. Единственный способ, которым я мог видеть это медленнее или медленнее, чем любой из других, — это если что-то происходит неявно. Например, при инициализации памяти первая форма пропускает, потому что она немедленно выполняет свою собственную инициализацию.

Первая форма меньше кода, чем вторая. Сравнительная скорость, вероятно, будет зависеть от платформы (и, возможно, компилятора). Платформы, которые позволяют управлять памятью как блоками, вероятно, быстрее найдут первое, в то время как платформы, которые могут адресовать только одно слово за раз, вероятно, найдут второе быстрее.

Вам нужно будет провести временные тесты на всех платформах, на которых вы планируете запускать, чтобы получить реальное представление о скорости.

Вероятно, есть более быстрая потоковая версия.

Если вы хотите пойти дальше и попытаться передать информацию для регионов, вам придется либо написать собственное решение, либо использовать стороннюю библиотеку. Обратите внимание, что это, вероятно, будет медленнее. Но может быть меньше кода. Я подозреваю, что ваш пример Python также работает медленнее на некоторых платформах (хотя и с меньшим количеством кода). Я предполагаю, что Python реализует его во многом как первый примерный блок кода в этом ответе.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *