诀窍是通过输出列(它们的行)在下三角形中查找值 . 您可以为每行的数据保留一个索引,因为您按行顺序访问输入的行顺序时的条目 .
与博览会类型
struct CSR { // sometimes implicitly symmetric
std::vector<...> vals;
std::vector cols,rowStart;
};
我们有
// Return the [r0,r1) by [c0,c1) submatrix, never
// using any symmetry it might have.
CSR submatrix(const CSR &sym,int r0,int r1,int c0,int c1) {
const int m=r1-r0,n=c1-c0;
std::vector finger(sym.rowStart.begin()+c0,sym.rowStart.begin()+c1);
CSR ret;
ret.rowStart.reserve(m+1);
ret.rowStart.push_back(0);
for(int r=0,rs=r0;r
// (Strictly) lower triangle:
for(int cs=c0,c=0;cs
for(int &f=finger[c],f1=sym.rowStart[cs+1];f
const int cf=sym.cols[f];
if(cf>rs) break;
if(cf==rs) {
ret.vals.push_back(sym.vals[f]);
ret.cols.push_back(c);
}
}
// Copy the relevant subsequence of the upper triangle:
for(int f=sym.rowStart[rs],f1=sym.rowStart[rs+1];f
const int c=sym.cols[f]-c0;
if(c<0) continue;
if(c>=n) break;
ret.vals.push_back(sym.vals[f]);
ret.cols.push_back(c);
}
ret.rowStart.push_back(ret.vals.size());
}
return ret;
}
对于大型矩阵,可以通过使用二进制搜索来优化上三角形循环以找到 f 的相关范围 .