我想问你一个我在使用 Fortran 管理 CSR/CSC* 矩阵时经常遇到的问题。假设我们有一个具有 N 个实数值的向量 V。该向量之前已经分配了一定的大小。现在我们必须在它中间的索引 P 处添加一个值。蛮力代码将是:
allocate(tempV(N))
tempV=V
deallocate(V)
allocate(V(N+1))
V=(/tempV(1:P-1), newValue, tempV(P:N)/)
deallocate(tempV)
显然,如果做一次没问题,但重复上千次就不会那么有效了。每个我想插入的值,内存都会填满和清空 4 次。
我想知道解决这个问题的更好程序。您可以提出普通的 Fortran(首选),也可以通过 MKL/Lapack/Blas 等库提出一些解决方案。
附录:我可以用 RESHAPE 来做吗?通过这个定义(与我的 Fortran 书籍定义相同),我可以做类似的事情
REAL, DIMENSION(1:1) :: newPad = (/ newValue /)
V=RESHAPE(V, (/ N+1 /), PAD=newPad)
现在值已添加到 V 的末尾,所以我用
V=(/V(1:P-1), V(N+1:N+1), V(P:N) /)
这样,可以避免显式创建临时向量并丢失分配。
由于 RESHAPE 可以在库中进行并行化,它是否高效且可扩展?
* PS:为了清楚起见,CSR = 压缩稀疏行格式,CSC = 压缩稀疏列格式,更多信息在这里:
MKL 定义: http: //software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-9FCEB1C4-670D-4738-81D2-F378013412B0.htm