如何有效地转置非方阵?

Posted

技术标签:

【中文标题】如何有效地转置非方阵?【英文标题】:How to efficiently transpose non-square matrices? 【发布时间】:2014-09-19 11:24:43 【问题描述】:

我做了一个矩阵类,我想实现一个转置的方法:

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
    

问题是如何实现非方阵的转置方法,而不分配一个全新的矩阵(该类用于大的密集矩阵)但就地。有没有办法?

【问题讨论】:

非方阵的就地转置算法非常棘手:en.wikipedia.org/wiki/In-place_matrix_transposition。另请注意,输出矩阵也需要交换其宽度和高度维度,因此您的类需要支持对这些维度的修改。 相关,可能是重复的:What is the fastest way to transpose a matrix in C++? 如何存储矩阵? @DDrmmr 作为一维 std::vector. 【参考方案1】:

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

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

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

【讨论】:

以上是关于如何有效地转置非方阵?的主要内容,如果未能解决你的问题,请参考以下文章

如何在最后一个可用交易日转置非交易日的推特数据? (Python)

在 Python 中懒惰地转置一个列表

有没有一种方法可以简单地转置 SQL 中的表。此表包含 Numeric 和 Varchar 值

C语言编程:N*N方阵的转置

对一个方阵转置,就是把原来的行号变列号,原来的列号变行号

foreach遍历数组数组的转置与方阵的迹