如何有效地转置非方形矩阵?

时间:2014-09-19 11:24:43

标签: c++ performance matrix linear-algebra

我制作了一个矩阵类,我想实现一个换位方法:

template<typename T>
void Matrix<T>::Transpose()
{
    // for square matrices
    if(this->Width() == this->Height())
    {
        for(std::size_t y = 1; y < this->Height(); ++y)
        {
            for(std::size_t x = 0; x < y; ++x)
            {
                // the function operator is used to access the entries of the matrix
                std::swap((*this)(x, y), (*this)(y, x));
            }
        }
    }
    else
    {
        // TODO
    }
}

问题是如何在不分配全新矩阵(该类用于大密集矩阵)的情况下实现非平方矩阵的转置方法,而是在其中。还有办法吗?

1 个答案:

答案 0 :(得分:6)

转置矩阵的最有效方法是根本不转置矩阵。

以一种允许通过另外存储行和列步长和偏移量来定义同一数据缓冲区上的子矩阵,切片或其他内容的方式来设计矩阵类可能是最有效的。 然后访问使用这些数据的元素来计算索引。要转置你只需要操纵这些步值。

您可以看看OpenCV的Matrix实现(仅用于实现功能,而不是用于类设计!)