如何有效地为20000*20000矩阵分配内存
how to effectively allocate memory for 20000*20000 matrix?
我的代码遵循PCA算法,以找到一个20000 *35矩阵的特征向量和特征值。为了找到特征向量,我需要找到协方差矩阵,在计算中它是20000*20000的数量级。
我该如何处理这么大的矩阵呢?我使用OpenCV为我的代码
我认为你的问题可能是不正确的;如果你正在做PCA,你的20000 * 35矩阵很可能对35个变量有20000个观察值(对20000个变量有35个观察值不会有太大用处,所以我猜这不是你的情况)。
如果是这种情况,协方差矩阵的大小为35 × 35,而不是20k × 20k。
您可以使用QR算法,Jacobi方法或任何其他特征值/特征向量近似算法(许多是特定于实对称矩阵的,如协方差矩阵的情况)计算35x35矩阵的所有特征对。
20K * 20K = 400,000,000。如果使用32位浮点数,则为1.6 GB。这将是一个庞大的矩阵,但大多数现代计算机应该能够在没有特殊优化的情况下合理地处理它(这里的合理意味着不会花费一周的时间来处理)。如果你使用的是64位双精度系统,那么你就会看到3.2 GB的内存,这是越来越大了,但在现代计算机上仍然不是完全无法管理的。
如果你需要这段代码真正表现良好,那么考虑你的矩阵是否密集/稀疏。如果密度太大,你就无能为力了。如果它是稀疏的,你可能可以做一些优化。
编辑:另外,考虑使用OpenCL/CUDA进行优化。一般来说,涉及矩阵的问题通常具有高数据级并行性,并且适合GPU方法。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 如何有效地为20000*20000矩阵分配内存