在计算两个稀疏矩阵的乘积时我遇到了问题。 这是程序:
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且大小为mxm的adj_mat2的矩阵。它们都是对称的。首先,我必须将x重新缩放到大小为(nxm)的矩阵Y(通过使用前n个元素作为第一列,将第二个n作为第二列,依此类推。之后,矩阵adj_mat1 * Y * adj_mat2 ^ T具有然后通过将彼此之下的所有列写入矢量来再次对该结果进行矢量化。
我在adj_mat1乘以Y时得到一个Segmentation错误。
只有当adj_mat1和adj_mat 2的大小不同时才会出现问题。
如果您需要更多信息,请询问。
提前谢谢。
亚历
解决方案:
问题在于插入值。我不得不在插图声明中更改quot和rem。现在它可以工作
Y.insert(divresult.rem, divresult.quot) = it.value();