gpt4 book ai didi

c++ - 如何在 C++ 运行时修改方法?

转载 作者:行者123 更新时间:2023-11-28 04:49:52 25 4
gpt4 key购买 nike

我来到这里是为了在复杂度为 O(1) 的情况下转置矩阵。所以现在我有这样的东西:

#include <vector>

template <class T>
class Matrix { //intended for math matrix
public:
Matrix(int Rows, int Cols){matrix = vector<vector<T> >(Rows, vector<T>(Cols,0)); transpose = false; cols = Cols; rows = Rows;}
Matrix(const Matrix<T> &M){matrix = M.matrix; transpose = M.transpose; cols = M.cols; rows = M.rows;}
~Matrix(){}

void t(){
transpose = !transpose;
swap(cols,rows);
}

T& operator()(int row, int col){
if(transpose)
return matrix[col][row];
else
return matrix[row][col];
}

private:
vector<vector<T> > matrix;
bool transpose;
int cols;
int rows;
};

在那段代码中我得到了我想要的:t() 是 O(1) 并且 operator() 也是 O(1)。但是 operator() 被用了很多,我想去掉 if
所以,为了验证我是否可以提高性能,我想要这样的东西:

#include <vector>

template <class T>
class Matrix { //intended for math matrix
public:
Matrix(int Rows, int Cols){matrix = vector<vector<T> >(Rows, vector<T>(Cols,0)); transpose = false; cols = Cols; rows = Rows;}
Matrix(const Matrix<T> &M){matrix = M.matrix; transpose = M.transpose; cols = M.cols; rows = M.rows;}
~Matrix(){}

T& originalShape(int row, int col){return matrix[row][col];}
T& transposedMatrix(int row, int col){return matrix[col][row];}
void t(){
transpose = !transpose;
swap(cols,rows);

if(transpose)
&operator() = &transposedMatrix;
else
&operator() = &originalShape;
}
T& operator()(int row, int col){return matrix[row][col];}

private:
vector<vector<T> > matrix;
bool transpose;
int cols;
int rows;
};

当然,那是行不通的。而且我没有发现任何对这种情况有用的东西。

有关 t() 和 operator() 的性能影响的更多信息:

我读到一些库在 O(1) 和 O(rows*cols) 中都使用 t(),具体取决于矩阵的用途。但是在 O(1) 中执行 t() 似乎是一个很好的第一步。如果那时我调用一个方法,我知道它会逐行访问,那么我可以在那个时候进行复制转置。

对于if:这个想法是将所有操作的权重放在t()中,并拥有最快的operator(),因为 t() 偶尔会被调用一次,而 operator() 会被调用很多次。我也想知道如何做到这一点,因为它可能在另一种情况下会有所帮助。

问题

也许我缺乏足够的英语来表达这一点:问题的目的是找到一种改变 operator() 行为的好方法。不是为了改进 Matrix()(尽管非常感谢您的建议),也不是为了改变 operator() 的行为,只是因为它可能 并不比 if 更好。最终,我将分析、编码并发布在我所拥有的和我得到的答案之间具有最佳性能的答案。但是要知道什么有更好的性能,我需要那些代码/算法/模式/任何东西,我认为这可能会帮助处于不同但相似情况下的其他人。

最佳答案

如果将矩阵存储为单个 vector ,则可以像这样编写索引函数:

T& operator()(int row, int col){
return matrix[col*colstep + row*rowstep];
}

最初 rowstep 是 1,colsteprows。转置运算符交换这两个值和大小。

你确实有一个额外的乘法,你必须衡量它是否比额外的 if 更好或更差。请注意,如果在循环中访问许多/所有矩阵元素,分支预测在大多数情况下会猜对。

您仍然会遇到以非最佳顺序访问数据的问题,值得在编写算法时考虑存储顺序。

关于c++ - 如何在 C++ 运行时修改方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com