C - 将行和列插入二维数组

时间:2014-06-06 22:56:01

标签: c mpi

说我有一个我声明的n x n数组:

int **matrix = malloc(n * sizeof *matrix);
for (i = 0; i < n; i++)
    matrix[i] = malloc(n * sizeof **matrix);

在某些时候进行一些测量,我想添加一个额外的行和列,就像在第二行和第二列之后。我想添加一个2.3行和列(2.2,3.2,2.3,3.3之间)。所以我想从已经设置的n x n数组(用数字等设置)到n+1 x n+1数组,在数组中间的某处有额外的行和行,而不是最后。

P.S。如果你很好奇,我正在尝试实现分层凝聚聚类算法,我必须用新的合并聚类递增相似度矩阵并重新重新进行相似度计算。

---编辑更多关于我的问题的信息,因为我需要帮助---

n x n数组用于n个实体的相似性。例如,n点坐标系统,n个文档文件,n个图像等。我试图实现的算法将这些文件中的两个合并在一起,创建一个新文件或一个集群。因此,在每次迭代中都会有一个新的集群(并且坦率地说,两个先前的集群将被合并,因此不会使用它们)需要检查与其余剩余集群/文件的相似性。当存在整个群集或给定数量的群集时,此过程将停止。无论如何,我希望你能得到这张照片。

3 个答案:

答案 0 :(得分:2)

在中间插入一行需要执行以下步骤:

  1. 分配足够大的新内存区域以容纳扩展行大小

  2. 循环遍历旧数组。直到插入点,只需复制旧数组中的值。到达插入点时,将指针添加到新行(您还需要分配)。然后继续复制原始数组中的其余条目。

  3. 释放原始外部阵列。

  4. 请注意,我没有说使用realloc。你可以这样做,但这会导致一些元素被不必要地复制两次。

    要在列内部,您需要对每个行数组使用相同的过程。

    请注意,插入数组中间是一项昂贵的操作,特别是在向2d数组添加列的情况下。如果它经常发生且阵列很大,你应该考虑切换到不同的数据结构。

答案 1 :(得分:1)

Realloc是这样做的方法。 C中的Realloc函数有两个参数,一个是指向当前内存块的指针,另一个是新大小。 Realloc只返回一个指向newely创建的内存的指针。所以说

int *i = realloc(matrix[i], (PreviousLength + 1) * sizeof(int));
PreviousLength += 1;

int i现在只包含你的新整数;因此可以立即设置为某种选择值。

请记住,当您以前使用过Malloc或Calloc时使用Realloc,而不是在使用新的时使用。如果你永远如愿。 上面的示例将向行[i]

添加另一列

查找更多信息here

答案 2 :(得分:1)

要扩展已存在的答案:使用realloc扩展数组的大小。然后,在先前填充的东西之后,额外的存储器将在概念上“在新阵列/指针的末尾”。如果你想在以前存在的东西之间插入东西,你需要自己移动数组内容。