1

我有一个矩阵A仍然挂着。它是大的、稀疏的和的对称的。我创建了一个名为 spDom 的稀疏域,其中包含非零条目。现在,我想遍历行r并在那里找到非零条目以及索引。我的目标是建立另一个本质上是 rowr非零的域。

4

1 回答 1

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;

我的解决方案依赖于命名为稀疏 CS* 域的未记录迭代器,该迭代器dimIter()可用于迭代连续存储在内存中的维度(因此 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 的行?)

于 2017-09-15T23:05:03.863 回答