我还有一个矩阵A
。它是大型,稀疏且新对称的。我创建了一个名为spDom的稀疏域,其中包含非零条目。现在,我想沿着行r
进行迭代,并在那里找到非零条目以及索引。我的目标是构建另一个基本上是行r
非零的域。
答案 0 :(得分:1)
只要您愿意以CSR格式存储稀疏域/数组,这里的答案将适用于Chapel 1.15:
首先,为了演示目的,我将建立我的(小的,非对称的)稀疏矩阵:
use LayoutCS; // use the CSR/CSC layout module
config const n = 10; // declare problem size
const D = {1..n, 1..n}; // declare dense domain
var SD: sparse subdomain(D) dmapped CS(); // declare sparse subdomain
// populate sparse domain with some indices
SD += (1,1);
SD += (1,n/2);
SD += (2, n/4);
SD += (2, 3*n/4);
SD += (n/2, 1);
SD += (n/2, n);
var A: [SD] real; // declare sparse array
forall (i,j) in SD do // initialize sparse array values
A[i,j] = i + j/10.0;
我的解决方案依赖于名为dimIter()
的稀疏CS *域上的未记录迭代器,它可用于迭代在内存中连续存储的维度(因此CSR行和CSC列)。 dimIter()
有两个参数:迭代的维度(1 =行,2 =列)和另一维度的索引。因此,为了迭代我上面定义的行,我可以这样做:
for r in 1..n {
writeln("row ", r, " contains elements at:");
for c in SD.dimIter(2, r) do
writeln(" column ", c, ": ", A[r,c]);
}
对于上面显示的稀疏矩阵,得到:
row 1 contains elements at:
column 1: 1.1
column 5: 1.5
row 2 contains elements at:
column 2: 2.2
column 7: 2.7
row 3 contains elements at:
row 4 contains elements at:
row 5 contains elements at:
column 1: 5.1
column 10: 6.0
row 6 contains elements at:
row 7 contains elements at:
row 8 contains elements at:
row 9 contains elements at:
row 10 contains elements at:
我们有兴趣推广dimIter()
迭代器并使其成为标准稀疏域/数组接口的一部分,但由于(a)关于如何推广的问题尚未完成它是n维稀疏数组和(b)关于我们是否需要支持低效迭代方向的问题(例如,如果考虑到费用,是否应该能够迭代CSR列或CSC行?)