使用链表转换稀疏矩阵(遍历问题) 我试图在C++中转换稀疏矩阵。我正在努力遍历新的转置矩阵。我想输入从矩阵第一行到新矩阵第一列的所有内容

使用链表转换稀疏矩阵(遍历问题) 我试图在C++中转换稀疏矩阵。我正在努力遍历新的转置矩阵。我想输入从矩阵第一行到新矩阵第一列的所有内容,c++,matrix,traversal,sparse-matrix,C++,Matrix,Traversal,Sparse Matrix,每一行都有数字应该在的列索引和数字本身 输入: 科林数 1 1 1 1 2 2 1 2 3 2 1 4 2 2 5 2 3 6 3 1 7 3 2 8 3 3 9 输入: 1233 1 4 2 5 3 6 172839 输出: 1 1 1 2 1 2 3 1 3 1 2 4 2 2 5 3 2 6 1 3 7 2 3 8 3 3 9 1 1 2 4 3 7 1238 1 3 2 6 3 9 如何使列表向下遍历第一列,在遍历过程中插入第一个元素,然后返回顶部,向下插入第二列。如果这是两个难以理

每一行都有数字应该在的列索引和数字本身

输入:

科林数

1 1 1
1 2 2
1 2 3
2 1 4
2 2 5
2 3 6
3 1 7
3 2 8
3 3 9
输入:

1233

1 4 2 5 3 6

172839

输出:

1 1 1
2 1 2
3 1 3
1 2 4
2 2 5
3 2 6
1 3 7
2 3 8
3 3 9
1 1 2 4 3 7

1238

1 3 2 6 3 9

如何使列表向下遍历第一列,在遍历过程中插入第一个元素,然后返回顶部,向下插入第二列。如果这是两个难以理解的问题,请道歉。但是我需要帮助的是遍历转置矩阵,使其在正确的时间处于正确的位置,并在正确的位置插入一个nz(非零)对象

这是我的密码

list<singleRow> tran;
//Finshed reading so transpose

for (int i = 0; i < rows.size(); i++){ // Initialize transposed matrix
    singleRow trow;
    tran.push_back(trow);
}

list<singleRow>::const_iterator rit;
list<singleRow>::const_iterator trowit; 
int rowind;
for (rit = rows.begin(), rowind = 1; rit != rows.end(); rit++, rowind++){//rit = row iterator
    singleRow row = *rit;
    singleRow::const_iterator nzit;
    trowit = tran.begin(); //Start at the beginning of the list of rows
    trow = *trowit;
    for (nzit = row.begin(); nzit != row.end(); nzit++){//nzit = non zero iterator
            int col = nzit->getCol();
            double val = nzit->getVal();
            trow.push_back(nz(rowind,val)); //How do I attach this to tran so that it goes in the right place?
            trowit++;
    }
}
列表传输;
//读得太快了
对于(inti=0;igetCol();
double val=nzit->getVal();
trow.push_back(nz(rowind,val));//如何将其附加到tran,使其位于正确的位置?
trowit++;
}
}

您对矩阵的表示效率低下:它没有利用矩阵稀疏的事实。我这么说是因为它包含了矩阵的所有行,即使它们中的大多数是零(空),就像稀疏矩阵通常发生的那样

你的代理也很难合作。因此,我建议首先转换表示(到常规的二维数组),转置矩阵,然后再转换回来

(编辑:) 或者,您可以更改表示,例如,如下所示:

struct singleElement {int row, col; double val;};
list<singleElement> matrix_input, matrix_output;

...
// Read input matrix from file or some such

list<singleElement>::const_iterator i;
for (i = matrix_input.begin(); i != matrix_input.end(); ++i)
{
    singleElement e = *i;
    std::swap(e.row, e.col);
    matrix_output.push_back(e);
}
输入:rowInd colInd num

1 1 1
1 2 2
1 2 3
2 1 4
2 2 5
2 3 6
3 1 7
3 2 8
3 3 9
输出:

1 1 1
2 1 2
3 1 3
1 2 4
2 2 5
3 2 6
1 3 7
2 3 8
3 3 9
代码如下所示:

struct singleElement {int row, col; double val;};
list<singleElement> matrix_input, matrix_output;

...
// Read input matrix from file or some such

list<singleElement>::const_iterator i;
for (i = matrix_input.begin(); i != matrix_input.end(); ++i)
{
    singleElement e = *i;
    std::swap(e.row, e.col);
    matrix_output.push_back(e);
}
struct singleElement{int row,col;double val;};
列出矩阵输入、矩阵输出;
...
//从文件或类似文件中读取输入矩阵
列表::常量迭代器i;
对于(i=matrix_input.begin();i!=matrix_input.end();++i)
{
单元素e=*i;
标准::交换(e.row,e.col);
矩阵输出。推回(e);
}
您对稀疏矩阵表示的选择对于换位来说很糟糕。有时,在考虑算法和数据结构时,最好的做法是将数据结构转换为更适合算法的结构,而不是将算法弄乱以使用错误的数据结构


例如,在这种情况下,您可以将矩阵读入一种表示法,这种表示法非常容易转换,然后写入您喜欢的任何表示法。如果空间是一个挑战,那么您可能需要逐块执行此操作,在目标表示中逐个分配新列,并在执行时取消旧表示中的列。

list对于矩阵来说是一个非常糟糕的选择(事实上,现在list对于几乎所有事物来说都是一个糟糕的选择),你使用它有什么特别的原因吗?我知道我只是选择了一个简单易懂的稀疏矩阵(实际上不是稀疏矩阵),让它更容易理解!虽然我同意他的表述并不是最好的,但我还没有看到实际相关的稀疏矩阵有完整的零行(因此是一个奇异矩阵)。好的,我确信它们存在于某些应用程序域中。但由于数值线性代数是稀疏矩阵的一个非常常见的用例,我至少不同意“通常”出现零行。但这可能只是一个应用领域的问题。