我有一个非常大的二维数组,我需要在这个数组上计算向量运算。 NTerms和NDoc都是非常大的整数。
var myMat = new double[NTerms, NDocs];
我需要从此矩阵中提取矢量列。目前,我正在使用for循环。
col = 100;
for (int i = 0; i < NTerms; i++)
{
myVec[i] = myMat[i, col];
}
此操作非常慢。在Matlab中,我可以在不需要迭代的情况下提取矢量,如下所示:
myVec = myMat[:,col];
有没有办法在C#中执行此操作?
答案 0 :(得分:3)
在C#中没有这样的结构可以让你像在Matlab中一样使用数组。使用您已有的代码,您可以使用.NET Framework 4.0中引入的Task Parallel Library来加速向量创建过程。
Parallel.For(0, NTerms, i => myVec[i] = myMat[i, col]);
如果您的CPU有多个核心,那么您将获得性能方面的一些改进,否则将无效。
有关如何将任务并行库与矩阵和数组一起使用的更多示例,您可以参考MSDN文章Matrix Decomposition。
但我怀疑C#在一些严肃的数学计算方面是个不错的选择。
答案 1 :(得分:0)
一些可能的问题:
可能是C#中多维数组访问元素的方式。见this earlier article。
另一个问题可能是你正在访问非连续的内存 - 所以缓存没有多少帮助,如果数组非常大,你甚至可能需要从虚拟内存(磁盘)中获取。
当您一次访问整行而不是列时,您的速度会发生什么变化?如果这个速度明显加快,你可以90%确定这是一个连续内存问题......