5

我有一个非常大的二维数组,我需要在这个数组上计算向量运算。NTerms 和 NDocs 都是非常大的整数。

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# 中做到这一点?

4

2 回答 2

5

在 C# 中没有这样的结构可以让您像在 Matlab 中那样使用数组。使用您已有的代码,您可以使用.NET Framework 4.0 中引入的任务并行库加快矢量创建过程。

Parallel.For(0, NTerms, i => myVec[i] = myMat[i, col]);

如果您的 CPU 有多个内核,那么您的性能会有所提高,否则不会有任何效果。

有关如何将任务并行库与矩阵和数组一起使用的更多示例,您可以参考 MSDN 文章矩阵分解

但是当涉及到一些严肃的数学计算时,我怀疑 C# 是一个不错的选择。

于 2013-02-11T16:02:24.070 回答
0

一些可能的问题:

可能是 C# 中多维数组访问元素的方式。请参阅这篇较早的文章

另一个问题可能是您正在访问非连续内存 - 因此缓存没有太多帮助,如果数组非常大,您甚至可能不得不从虚拟内存(磁盘)中获取。

当您一次访问一整行而不是一列时,您的速度会发生什么变化?如果这明显更快,那么您可以 90% 确定这是一个连续内存问题......

于 2013-02-12T00:48:45.440 回答