【发布时间】:2015-01-03 11:36:18
【问题描述】:
几天来,我一直在用 C 转换一个锯齿状数组时遇到问题,我真的找不到解决方案。基本上,我们得到一个大部分为零的矩阵(稀疏矩阵),我们打算将其转换为锯齿状数组。我能够做到这一点没有问题。备用矩阵是
7 8
0 0 0 5 1 0 0 5
0 0 0 0 0 0 0 0
0 0 0 0 1 2 0 0
1 0 0 0 0 0 0 0
3 0 0 5 0 0 3 0
1 0 0 0 0 3 0 0
0 0 0 0 0 0 0 1
7 和 8 是行和列,我们应该首先阅读它们。行全为零的任何点(在本例中为第二行),锯齿状数组都意味着具有 NULL。我们应该使用我在这个循环中执行的 calloc() 为锯齿状数组分配内存:
for(i=0; i<rows; i++)
{
for(j=0; j<columns; j++)
{
if(matrix[i][j] != 0)
{
flag++;
}
}
if(flag > 0)
{
jagged[i] = (float *)calloc(flag, sizeof(float));
}
else
{
jagged[i] = NULL;
}
flag = 0;
}
所以我的锯齿状数组打印为:
5 1 5
NULL
1 2
1
3 5 3
1 3
1
这是按原样打印的,并且工作正常。然后,我们打算将锯齿状数组添加到自身,我在这个循环中(在函数内部)执行此操作:
for(i=0; i<rows; i++)
{
if(jagged[i]) //if the row exists, continue
{
for(j=0; j<columns; j++)
{
if(jagged[i][j]) //if the index exists, add it to itself
{
jagged[i][j] += jagged[i][j];
}
}
}
}
这也可以正常工作,新的锯齿状数组打印为:
10 2 10
2 4
2
6 10 6
2 6
2
最后一部分是我卡住的地方。我现在打算转置上面的数组(行变成列)。我已经尝试了几种方法来解决这个问题。我尝试使用 calloc() 创建一个新数组,其循环类似于上面的循环,但循环通过锯齿状数组,并且行和列颠倒。但是,每当我尝试沿着锯齿状数组的列向下移动时(循环从锯齿状 [0][0] 开始,然后下一次迭代在锯齿状 [1][0] 处),我总是会遇到分段错误,即使我是检查正在检查的下一行/元素是否为 NULL。有没有更好的方法来做这个换位,或者我在做这件事的方式上犯了可以修复的错误?这让我沮丧了将近一个星期,因此非常感谢任何帮助。如有必要,可以提供更多详细信息。提前致谢!
【问题讨论】:
-
当您为锯齿状数组的第一行写入
5 1 5时,它代表的是“完整”数组中的0 0 0 5 1 0 0 5行还是5 1 5 0 0 0 0 0行?我们怎么知道? -
我给出的矩阵是我们从中读取的.txt文件,抱歉我没有提到
-
输入的格式没有问题。矩阵行
5 1 5 0 0 0 0 0与0 0 0 5 1 0 0 5不同。我们可以很容易地看到这些行中的哪一行在 input 中,问题是我们如何知道这两行中的哪一行 存储 在您的锯齿状数组中。 -
我只将非零值读入数组。锯齿状数组本身不包含任何零。
-
那么您丢失了输入中的基本信息。您无法从数据结构中构造原始输入数组的转置。还不清楚“转置”数据结构意味着什么,因为您的数据结构不支持矩阵转置。
标签: c jagged-arrays