在C中生成稀疏矩阵

时间:2014-07-23 14:09:12

标签: c random sparse-matrix

是否有更简单的方法来生成除此之外的稀疏矩阵?

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

感谢。

我使用数组用于表示目的

2 个答案:

答案 0 :(得分:2)

使用a确定您希望它的稀疏程度。

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

答案 1 :(得分:0)

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&lt;数组长度的平方根。如果您担心重复的random使事情比您想要的更稀疏,您可以相应地进行修改:

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;
}

在这两种情况下,我交替使用+/- 1作为非零值,但如果你想要更随机,那么很容易替换array[index]赋值的右侧

最后,如果我在C语法上松散了一些东西,我会问你的放纵。我的C生锈了大约15年,但意图应该是明确的。