我有一个txt文件,其结构如下:
<num Rows> <num Columns>
<M(0,0)> ... <M(0,nColumns-1)>
...
<M(nRows-1,0)> ... <M(nRows-1,nColumns-1)>
换句话说,第一行只有2个标量,即矩阵中的行数和列数。从第二行开始,矩阵体开始。
我想在C ++中导入这样的矩阵,遵循以下步骤:
到目前为止,我一直在尝试以下代码:
har line[256];
int nRows; int nCols;
int i; int j;
bool FirstLine=true;
while (fgets(line, sizeof(line), fileIN)) {
if (FirstLine==true){
char nRowsC=line[0];
nRows=nRowsC- '0';
char nColsC=line[2];
nCols=nColsC- '0';
FirstLine=false;
double **myMat=(double**)malloc(nRows*sizeof(double*));
for(i=0; i<nRows; i++){
myMat[i]=(double*)malloc(nCols*sizeof(double));
}
printf("Number of rows in data matrix: %d\n",nRows);
printf("Number of columns in data matrix: %d\n\n",nCols);
for(i = 0; i < nRows; i++)
{
for(j = 0; j < nCols; j++)
{
if (!fscanf(fileIN, "%lf", &myMat[i][j]))
break;
printf("(%d,%d) %lf\n",i,j,myMat[i][j]);
}
}
}
}
cout << '\n'; cout << '\n'; cout << '\n';
for(i = 0; i < nRows; i++)
{
for(j = 0; j < nCols; j++)
{
printf("(%d,%d) %lf\n",i,j,myMat[i][j]); //<-- this line gives the error
}
}
一切似乎都没问题但如果我打印出这样的矩阵,我会收到一个错误,标识符“myMat”未声明(特别是:“使用未声明的标识符'myMat'”。编译器:Mac OS X 10.11上的XCode 7.2)。
答案 0 :(得分:2)
你自己说过:myMat
在...已经被关闭的范围内声明。
与Python不同,C++ has block-scoping规则:
double** myMat;
{
int inner;
myMat = foo(); // allowed: myMat is visible here
}
inner = 5; // compiler error: inner not visible anymore
如果你想访问这个变量,你应该在外部范围内声明,并在现在填写的地方填写它。
作为旁注,C ++正朝着我们不再在应用程序代码中分配太多的方向发展。如果将其恢复为使用std::vector
:
using Row = std::vector<double>;
using Matrix = std::vector<Row>;
Matrix myMat;
请参阅http://cpp.sh/4iu4上的示例。