如何有效地转置非方阵?
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)