Matlab转C++程序出错调试
一. 背景:
一开始拿到两份代码时,觉得很难,开始的思路是觉得得把两份代码都看懂,然而发现matlab中有很多不认识的函数名,函数中也有不认识的函数名,说明文档也有复杂的公式。但其实真正去调试的时候发现并不需要知道原理,基本只要知道程序每一步在干什么就可以了
二. 思路:
考虑到代码数据量很大,循环2万次,矩阵大小200*200级别,在控制台输出信息比较效率很低,于是选择将矩阵输出到excel中,对比两份文件的结果,而在函数中对比输出变量则采取设断点调试
三. 主要问题:
- 矩阵输出到excel,采用逗号分隔,保存为csv文件
函数实现
void SaveData2(string path, double** data)
{
ofstream outFile;
outFile.open(path, ios::out);
for (int i = 0; i < LZ; i++)
{
for (int j = 0; j < LX; j++)
{
outFile <<setprecision(20)<<data[i][j] << ',';
}
outFile << endl;
}
outFile.close();
}
具体调用
SaveData2("E:\\data\\C++\\C_GL.csv", GL);
- memset函数只能设置值为-1或者0,
注意尤其不可以设置为1 ,要想设置为一,可以遍历一遍,暂时只想到这个方法
Memset(TempSX, 1, sizeof(TempSX));
- 为提高效率循环体内有多次运算结合放在一起,但是没考虑到多次运算中一些数据的依赖性
matlab 的部分代码
for i=1:LZ
for j=1:LX-1
SX(i,j)=SX(i,j)*max(sign(FLX(i,j))*abs(TX(i,j)),-sign(FLX(i,j))*abs(TX(i,j+1)));
end
end
for i=1:100-1
for j=1:200
SY(i,j)=SY(i,j)*max(sign(FLY(i,j))*abs(TX(i,j)),-sign(FLY(i,j))*abs(TX(i+1,j)));
end
end
for i=1:100
for j=1:200-1
TX(i,j)=SX(i,j)*FLX(i,j);
end
end
for i=1:100-1
for j=1:200
TY(i,j)=SY(i,j)*FLY(i,j);
end
end
改成C++的代码
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 200; j++)
{
if (j != LX - 1)
{
TempSX[i][j] = TempSX[i][j] * max(Sign(FLX[i][j]) * abs(TX[i][j]), -Sign(FLX[i][j]) * abs(TX[i][j + 1]));
TX[i][j] = TempSX[i][j] * FLX[i][j];
}
}
}
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 200; j++)
{
if (i != LZ - 1)
{
TempSY[i][j] = TempSY[i][j] * max(Sign(FLY[i][j]) * abs(TX[i][j]), -Sign(FLY[i][j]) * abs(TX[i + 1][j]));
TY[i][j] = TempSY[i][j] * FLY[i][j];
}
}
}
但是不对的,SY里的值是需要还未进行循环的TX值,而上面的程序SY的赋值中TX是循环后的 4. 产生访问冲突,出现了很多次
- memset设为1改成设为0,然后循环遍历
解决:不知道为什么会出现访问冲突的错误,设断点调试发现正常进入赋值了再重新运行又可以了 - 发现矩阵的行列数设置错了或者是原有的文件被我删了
- 或者实在找不出就使用另一种方式,输出文件到excel就使用了两种方法的
- 其余错误是符号错误了如乘号写成减号,括号顺序不对
- matlab从一开始,C++从零开始
四. 思考
花了接近三天,觉得可以有更加提高效率的方法,尤其是比较excel时我是用人工加excel表格操作一份一份比较的,觉得可以用python更快且可以批量处理(不过其实也有想到后者也不一定效率太高,如果不够熟练的话)而在vs studio 与matlab中进行调试时使用分屏,一个界面里既要有代码查看又要有变量查看,视图不方便,当时操作很笨拙,暂时还没想到更好的方法。
|