一开始拿到两份代码时,觉得很难,开始的思路是觉得得把两份代码都看懂,然而发现matlab中有很多不认识的函数名,函数中也有不认识的函数名,说明文档也有复杂的公式。但其实真正去调试的时候发现并不需要知道原理,基本只要知道程序每一步在干什么就可以了
考虑到代码数据量很大,循环2万次,矩阵大小200*200级别,在控制台输出信息比较效率很低,于是选择将矩阵输出到excel中,对比两份文件的结果,而在函数中对比输出变量则采取设断点调试
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);
注意尤其不可以设置为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. 产生访问冲突,出现了很多次
花了接近三天,觉得可以有更加提高效率的方法,尤其是比较excel时我是用人工加excel表格操作一份一份比较的,觉得可以用python更快且可以批量处理(不过其实也有想到后者也不一定效率太高,如果不够熟练的话)而在vs studio 与matlab中进行调试时使用分屏,一个界面里既要有代码查看又要有变量查看,视图不方便,当时操作很笨拙,暂时还没想到更好的方法。