如何高效地转置非方阵矩阵?

3
我创建了一个矩阵类,我想实现一个转置方法:
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
非方阵的原地转置算法相当棘手:https://en.wikipedia.org/wiki/In-place_matrix_transposition。还要注意,输出矩阵的宽度和高度维度也需要交换,因此您的类需要支持这些修改。 - Paul R
关于可能是一个重复问题的内容:如何在C++中最快地转置矩阵? - Shafik Yaghmour
1
你如何存储矩阵? - D Drmmr
作为一个1D的std::vector - Fytch
1个回答

6

最有效的矩阵转置方法并不是真正地进行矩阵转置。

设计矩阵类的最有效方法可能是允许在相同的数据缓冲区上定义子矩阵、切片或其他内容,同时存储行和列的步长以及偏移量。 然后,在访问元素时,使用这些数据来计算索引。要进行转置,只需要操作这些步骤值。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接