在 C++ 中向量化一个巨大矩阵的一部分

计算科学 C++ 矩阵 矢量化 犰狳
2021-12-16 10:29:55

我有一个大矩阵,边长约为我需要多次将这个矩阵与另一个矩阵进行元素乘法。我通过以下方式完成此过程:n1000

  1. 向量化(通过犰狳)这个矩阵,即将它展平在一个数组中。
  2. 将此阵列拆分为多个核心。每个核心将占据该矩阵的一部分并进行乘法运算。

现在我意识到,出于数学原因,我只需要这个矩阵的上三角部分。如何仅矢量化上三角部分并丢弃矩阵的其他组件?简单地循环并不是那么好。我还有其他选择吗?

我的矩阵是犰狳复矩阵arma::cx_mat我目前的矢量化功能是:

typedef double Real;
typedef std::vector<std::complex<Real> > VecType;
arma::cx_mat myMatrix;
//fill my matrix...
VecType  vectorizedMatrix = arma::conv_to<VecType>::from(myMatrix);

我觉得std::vector非常有用,因为我使用标准算法非常有效地进行元素乘法std::transform(),这是最佳优化(AFAIK)。

1个回答

所以我发明了自己的解决方案。批评,建议受到高度赞赏。

我了解到元素作为column-major存储在矩阵中。所以我假设std::copy()在单列上使用迭代器只会给出连续的元素,因此速度会更快。

这是我的解决方案:

template <typename T>
std::vector<T> vectorizeMatrix_upperTriangular_columnMajor(const arma::Mat<T>& mat)
{
    std::vector<T> output((mat.n_cols*(mat.n_cols-1))/2);
    typename arma::Mat<T>::const_iterator it = mat.begin() + mat.n_rows; //iterator at rows to skip in every step, starts at second column
    long toSkipInVec = 0;
    for(int i = 1; i < mat.n_cols; i++) //Starts with 1 to skip the diagonal
    {
        std::copy(it, it + i, output.begin() + toSkipInVec);
        toSkipInVec += i;
        it += mat.n_rows;
    }
    return output;
}