matlab转C++程序出错调试
2022/1/2 20:08:03
本文主要是介绍matlab转C++程序出错调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- Matlab转C++程序出错调试
- 一. 背景:
- 二. 思路:
- 三. 主要问题:
- 四. 思考
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中进行调试时使用分屏,一个界面里既要有代码查看又要有变量查看,视图不方便,当时操作很笨拙,暂时还没想到更好的方法。
这篇关于matlab转C++程序出错调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享