这是一个困扰我的小班:
class matrix{
string name;
int rowSize, columnSize;
// I could declare double m[100][100]; here but that would be ugly
public:
void createMat(){
cout << "Enter Matrix Name:";
cin >> name;
cout << "Enter number of rows: ";
cin >> rowSize;
cout << "Enter no. of columns: ";
cin >> columnSize;
double m[rowSize][columnSize]; //needs to be available to readMat()
cout << "Enter matrix (row wise):\n";
for(int i = 0; i < rowSize; i++){
for(int j = 0; j < columnSize; j++){cin >> m[i][j];}
cout<<'\n';
}
}
void readMat(){
cout << "Matrix " << name << " :\n";
for(int i = 0 ; i < rowSize; i++){
for(int j = 0; j < columnSize; j++){ cout << m[i][j] << ' ';}
cout<<'\n';
}
}
};
如何以最佳方式向m
和createMat()
提供readMat()
?
是否试图让用户输入不必要的矩阵尺寸?
从我的观点来看,我觉得我定义矩阵的最大尺寸会在需要更多元素的情况下限制太多,或者如果没有那么多的元素则需要太多。
答案 0 :(得分:1)
您应该使用动态大小的内存块,并在用户输入的基础上在运行时分配它。在这里,我使用std::vector
:
class matrix{
std::string name;
int rowSize, columnSize;
std::vector<double> m;
public:
void createMat(){
std::cout << "Enter Matrix Name:";
std::cin >> name;
std::cout << "Enter number of rows: ";
std::cin >> rowSize;
std::cout << "Enter no. of columns: ";
std::cin >> columnSize;
m.resize(rowSize*columnSize);
std::cout << "Enter matrix (row wise):\n";
for(int i = 0; i < rowSize; i++){
for(int j = 0; j < columnSize; j++){
std::cin >> m[i*columnSize+j];
}
std::cout<<'\n';
}
}
void readMat() {
std::cout << "Matrix " << name << " :\n";
for(int i = 0 ; i < rowSize; i++){
for(int j = 0; j < columnSize; j++) {
std::cout << m[i*columnSize+j] << ' ';
}
std::cout<<'\n';
}
}
};
答案 1 :(得分:1)
我对你问题的回答是:
我会做一些不同的事情,特别是:
而不是createMat()
我会使用类构造函数来执行初始化工作(由于这个原因,存在构造函数)。
然后我会将元素存储在private
1D数组element[rowSize*columnSize]
中(在构造函数中动态分配)。
然后我会创建void setElement(i,j)
和double getElement(i,j)
方法。
(考虑查看EIGEN库,一个非常灵活且易于使用的线性代数库,具有类似Matlab的风格)
答案 2 :(得分:0)
您需要将m
定义为类成员并进行动态内存分配。
class matrix{
string name;
int rowSize, columnSize;
double **m;
void createMat(){
m = new double*[rowSize];
for(int i = 0; i < rowSize; ++i)
m[i] = new double[columnSize];
}
}
这是一个详细的教程:http://www.cs.umb.edu/~mweiss/cs410_f04/ppts/cs410-7.pdf