Перезапись вложенного для l oop как одиночного для l oop без избыточности в C для OpenMP - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать функцию, которая в списке массивов будет сравнивать каждый массив с каждым массивом, который идет после него: массив 0 будет сравнивать себя с массивами 1, 2, 3, 4 и т. Д., Массив 1 будет сравнивать себя с массивами 2, 3, 4 и так далее, но не с 0, как мы уже сравнивали. То же самое и в остальном: массив 2 будет сравнивать себя с 3, 4 и т. Д.

Обычно это можно сделать с помощью простого вложенного для l oop:

for (int i = 0; i <= number_of_arrays - 1; i++){
    for (int j = i+1; j<= number_of_arrays; j++){
        printf("Comparing Array %d with Array %d", i, j);
    }
}

Однако, поскольку я использую OpenMP, я не могу использовать #pragma omp for внутри другого. В решении обычно также используется collapse(2), но я также не могу использовать, поскольку счетчик моего внутреннего l oop зависит от счетчика моего внешнего.

Чтобы не было эта проблема, я должен превратить это в один for l oop, общее решение этого, похоже:

for (int i = 0; i <= (number_of_arrays - 1)*number_of_arrays; i++){
       printf("Comparing Array %d with Array %d", i/number_of_arrays, i%number_of_arrays);
   }
}

Это, однако, вызовет избыточность моего кода, поскольку я буду , например, сравните массив 0 с массивом 1, а затем массив 1 с массивом 0. Как я могу превратить то, что у меня есть, в один for l oop, который не будет выполнять избыточных сравнений?

Ответы [ 2 ]

0 голосов
/ 27 мая 2020
for (int i = 0; i <= (number_of_arrays - 1)*number_of_arrays; i++)
{
    if(i%number_of_arrays > i/number_of_arrays)
       printf("Comparing Array %d with Array %d\n", i/number_of_arrays, i%number_of_arrays);
}
0 голосов
/ 27 мая 2020

вы можете добавить простое условие if с помощью continue.

for (int i = 0; i <= (number_of_arrays - 1)*number_of_arrays; i++){
   if(i/numer_of_arrays >= i%number_of_arrays)
        continue; 
   printf("Comparing Array %d with Array %d", i/number_of_arrays, i%number_of_arrays);
}
...