矩阵转置模板
matrix transpose template
本文关键字:转置 更新时间:2023-10-16
当我试图使用模板编写矩阵转置的代码时,我会出现以下错误。
错误1错误C2248:"矩阵::元素":无法访问类"矩阵"中声明的私有成员
有人能告诉我如何纠正这个错误吗?
//Matrix.h
#include <iostream>
#include <vector>
using namespace std;
template<class T, int m, int n>
class Matrix;
template<class T, int m, int n>
class Matrix
{
vector<vector<T>> elements;
int nrow;
int ncol;
public:
Matrix();
~Matrix();
void print();
Matrix<T, n, m> transpose();
};
template<class T, int m, int n>
Matrix<T, m, n>::Matrix() : nrow(m), ncol(n)
{
for (int i = 0; i < nrow; i++){
vector<T> row(ncol, i);
elements.push_back(row);
}
}
template<class T, int m, int n>
Matrix<T, m, n>::~Matrix(){}
template<class T, int m, int n>
Matrix<T, n, m> Matrix<T, m, n>::transpose(){
Matrix<T, n, m> m;
for (int i = 0; i < nrow; ++i){
for (int j = 0; j < ncol; ++j){
m.elements[j][i] = elements[i][j];
}
}
return m;
}
template<class T, int m, int n>
void Matrix<T, m, n>::print()
{
for (int i = 0; i < nrow; i++){
for (int j = 0; j < ncol; j++)
{
cout << elements[i][j] << " ";
}
cout << endl;
}
}
//main.cpp
#include "Matrix.h"
using namespace std;
int main()
{
Matrix<int, 3, 2> a;
Matrix<int, 3, 2> b;
Matrix<int, 2, 3> c;
c = a.transpose();
c.print();
}
Matrix<T, n, m>
和Matrix<T, m, n>
在m != n
时完全是不同的类。这意味着您无法在Matrix<T, m, n>
的成员函数中访问Matrix<T, n, m>
的私有成员。
你可以添加好友声明来解决这个问题:
template<class T, int m, int n>
class Matrix
{
vector<vector<T>> elements;
int nrow;
int ncol;
public:
Matrix();
~Matrix();
void print();
Matrix<T, n, m> transpose();
friend class Matrix<T, n, m>;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
};
问题是当m
和n
不同时,Matrix<T, m, n>
和Matrix<T, n, m>
是不同的类。一方无法访问另一方的private
成员。您可以通过提供public
成员函数来避免访问问题,这些函数提供对private
成员变量的访问。
如果m
和n
相同,您不会注意到问题。
错误在于代码中的以下函数:
template<class T, int m, int n>
Matrix<T, n, m> Matrix<T, m, n>::transpose() {
Matrix<T, n, m> m;
for (int i = 0; i < nrow; ++i) {
for (int j = 0; j < ncol; ++j) {
m.elements[j][i] = elements[i][j];
}
}
return m;
}
错误的原因是您正在创建一个新的矩阵m
。在这个矩阵中,元素是一个私有变量,因此你不能访问它。我建议要么创建一个公共getter函数来返回指向元素的指针,要么让元素成为公共变量(但这可能不是一个好的风格,因为它没有封装数据)。
getter函数可以很简单:
vector<vector<T> >* get_elements_ptr() {
return &elements;
}
你的问题函数应该看起来像:
template<class T, int m, int n>
Matrix<T, n, m> Matrix<T, m, n>::transpose() {
Matrix<T, n, m> m;
for (int i = 0; i < nrow; ++i) {
for (int j = 0; j < ncol; ++j) {
m.get_elements_ptr()->at(j)[i] = elements[i][j];
}
}
return m;
}
这将解决您的问题。然而,顺便说一句,我认为你的项目设计可以完全调整一下,以完全避免在另一个矩阵对象中有矩阵。您是否考虑过使用一个指向动态分配矩阵的指针?这将极大地减少程序的复制量,并将大大提高程序的内存和运行效率。
希望这能有所帮助!
相关文章:
- 转置矩阵:交换元素不会更改值
- 使用 Eigen 3 库编写一个带有转置作为参数的函数
- 犰狳(C++)中的快速阵列置换(广义张量转置)
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 转置结构容器
- 我的转置矩阵代码有什么问题?
- 数组的转置和乘法
- 在C++中使用矢量转置 2D 矩阵
- 特征:块转置
- MKL矩形矩阵Inplace转置:不使用多个核心
- 并行转置不同的矩阵
- 关于次级对角线的转置(翻转)矩阵
- 输出是从您输入的矩阵中打印出矩阵的转置,但我的代码只是打印出您输入的第一个矩阵
- 如何在阵列火中避免翻转和转置的memcpy?
- CUDA矩阵与共享内存转置
- C 阵列的复合物共轭转置
- 转置期间的动态内存分配
- 转置的一维矢量的平均矢量
- 在CUDA中具有共享MEM的非方面矩阵转置
- 通过矩阵转置优化矩阵乘法