我不能确定这个问题有一个正确的答案,但是让我们试试。虽然许多数值问题可以用线性代数的形式来表述,但从我的有限经验来看,在使用Math.NET进行简单操作时,与编写等效操作的原始数组相比,存在性能开销。
作为测试案例,我编写了代码来计算向量和列表中最接近向量之间的距离,包括三个版本:在数组上操作、在稠密向量上操作以及在带有MKL提供程序的稠密向量上操作。在数组上运行的速度大约比在向量上运行快4倍,在使用MKL提供程序时要快3倍。
缺点是我不得不手动编写距离计算,而不是利用内置的Norm函数。好处是它更快。注意:我没有发布代码,如果需要,我很乐意这样做,我可能也没有正确地使用Math.NET。
所以我的问题是:对我来说,使用更高级的抽象会带来性能成本。一般情况下是这样吗?还是有一些情况(例如稀疏矩阵),在这些情况下使用Math.NET预计会优于手动编写的数组操作?
如果是这种情况,我倾向于认为使用Math.NET的线性代数部分主要有用于涉及矩阵的“真正”的代数,以避免重新实现更复杂的计算/算法,并潜在地提高代码可读性,但对于更简单的逐个向量操作,最好还是使用原始数组。希望能够解开何时使用库和何时自行编写的一些问题!