计算两个稀疏矩阵的乘积时出现问题。这是程序:
void RandomWalk::calculateAx(const SpMat &x, const SpMat &adj_mat1, const SpMat &adj_mat2, const double &lambda, SpMat &result)
{
SpMat Y(adj_mat1.cols(), adj_mat2.rows());
for (int k=0; k<x.outerSize(); ++k)
{
for (SpMat::InnerIterator it(x,k); it; ++it)
{
div_t divresult;
divresult = div (it.row(),adj_mat1.rows());
Y.insert(divresult.quot, divresult.rem) = it.value();
}
}
SpMat tmp;
tmp = adj_mat1 * Y; // <-- error in this line
tmp = tmp * SpMat(adj_mat2.transpose());
result.resize(adj_mat1.rows()*adj_mat2.rows(), 1);
result.setZero();
for (int k=0; k<tmp.outerSize(); ++k)
{
for (SpMat::InnerIterator it(tmp,k); it; ++it)
{
result.insert(it.col()*adj_mat1.rows()+it.row(), 0) = it.value();
}
}
result = lambda * result;
result = x - result;
}
x 是大小为 (k,1) 的矩阵。adj_mat1 是大小为 nxn 的矩阵,adj_mat2 是大小为 mxm 的矩阵。它们都是对称的。首先,我必须将 x 重新缩放为大小为 (nxm) 的矩阵 Y(通过使用前 n 个元素作为第一列,第二个 n 作为第二列,依此类推。之后矩阵 adj_mat1*Y*adj_mat2^T 有计算。然后必须再次通过将彼此下方的所有列写入向量来对该结果进行向量化。
在将 adj_mat1 与 Y 相乘时出现分段错误。
仅当 adj_mat1 和 adj_mat 2 的大小不同时才会出现此问题。
如果您需要更多信息,请询问。
先感谢您。
亚历克斯
解决方案:
问题是值的插入。我不得不更改插入语句中的 quot 和 rem。现在它可以工作了
Y.insert(divresult.rem, divresult.quot) = it.value();