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



我有一个非常大的二维数组,我需要在这个数组上计算向量运算。NTerm和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#中有什么方法可以做到这一点吗?

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

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

如果你的CPU有多个核心,那么你的性能会有所提高,否则不会有任何影响。

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

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

一些可能的问题:

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

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

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

相关内容

  • 没有找到相关文章

最新更新