Создание разреженной матрицы в C

Вопрос:

Есть ли более простой способ создания разреженной матрицы, кроме этого?

for (i = 0; i < 1000; i++)
{
if (rand() % 3 == 0)
{
array[i] = rand() % 3;
}
else
{
array[i] = ((rand() % 3) - 1);
}
}

Благодарю.

Я использовал массив для презентационных целей

Лучший ответ:

Пусть t – целевое число ненулевых элементов в массиве, которое должно быть намного меньше длины массива для разреженности. Я предполагаю, что ваш массив имеет length. Я также генерирую случайные индексы без оператора модуля, чтобы избежать модульного смещения.

for (i = 0; i < t; ++i) {
   int index = (int) (length * ((double) rand() / (RAND_MAX + 1.0)));
   array[index] = i % 2 ? -1 : 1;
}

Обратите внимание, что это может дать несколько меньше, чем t ненулевых элементов, потому что случайные числа могут создавать дубликаты, но это должно быть редко, если оно действительно разрежено, например, t <квадратный корень из длины массива. Если вас беспокоит дублирование рандомов, делающих вещи более скудными, чем вы хотите, вы можете соответствующим образом изменить:

for (i = 0; i < t;) {
   int index = (int) (length * ((double) rand() / (RAND_MAX + 1.0)));
   if (array[index]) {  /* something already at this index */
      continue;         /* skip incrementing and try again */
   }
   array[index] = i % 2 ? -1 : 1;
   ++i;
}

В обоих случаях я чередую + / – для ненулевых значений, но если вы хотите, чтобы это было более случайным, было бы легко заменить правую часть назначения array[index].

Наконец, я прошу вашего снисхождения, если я что-то припудрил на синтаксисе Си. Мой C примерно 15 лет ржавый, но намерение должно быть ясным.

Ответ №1

С определить, насколько скудны вы хотите быть. a

for (i = 0; i < 1000; i++)
{
if (rand() % a == 0)
{
array[i] = rand() % 100;
}
else
{
array[i] = 0;
}
}

Оцените статью
TechArks.Ru
Добавить комментарий