C:聪明地“移动”矩阵?

时间:2010-11-02 13:54:24

标签: c matrix shift

我有一个整数矩阵,应该像缓冲区一样:

x = {{0, 0, 0, 0, 0}, {1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}};

现在,如果我添加新行{3, 3, 3, 3, 3},新矩阵应如下所示:

x = {{1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}, {3, 3, 3, 3, 3}};

有没有一种巧妙的方法可以在不复制所有元素的情况下这样做?

6 个答案:

答案 0 :(得分:8)

如果您的矩阵定义为int **并且您单独分配每一行,那么您只需要交换行指针。

答案 1 :(得分:6)

模运算怎么样?

如果您将元素作为matrix[x + SZ * y]访问,则可以将其更改为:

matrix[x + SZ * ((y + FIRST_ROW) % SZ)]

通过这种方式来实现这种转换,你只需将新行{3,3,3 ..}放在行{0,0,0}所在的位置,然后递增FIRST_ROW计数器以指向新的起始行。

答案 2 :(得分:1)

使用链接列表。

struct node
{
    int row[5];
    struct node *next;
};

追加一行就像将列表移到最后一样简单,然后用新节点(其下一个指针为NULL)替换NULL下一个指针。

答案 3 :(得分:1)

你能增加x以便它指向第二行,然后释放第一行吗?显然,您需要一次分配一行,这不能保证矩阵是连续的。如果你需要,你可以分配一大块内存来保存矩阵,然后在你到达目的地时破坏未使用的部分。

答案 4 :(得分:1)

如果使用指向数组的指针数组(而不是普通的二维数组),则只能将指针复制到行而不是复制所有元素。

如果您可以使用指针数组进行过度分配,则可以在末尾添加一个新指针并将指针前进到数组的“start”。但如果您可能想多次进行此类转换,这不是一个好主意。当然,您需要确保将原始指针放在某处,以便正确free()您的资源。

答案 5 :(得分:1)

懒惰编写代码示例 - 您可以使用模数算术来处理行。推送新行时,只需增加起始偏移量变量,添加矩阵高度并按矩阵高度对结果进行模数计算。通过这种方式,您可以获得一个圆形矩阵,无需复制整个矩阵并保持矩阵阵列的紧凑。