在C#中有效地从二维数组中提取矢量

时间:2013-02-11 15:38:05

标签: c# arrays performance matlab copy

我有一个非常大的二维数组,我需要在这个数组上计算向量运算。 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#中执行此操作?

2 个答案:

答案 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%确定这是一个连续内存问题......