ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

matlab转C++程序出错调试

2022-01-02 19:03:59  阅读:224  来源: 互联网

标签:FLY 200 end TX FLX C++ abs matlab 出错


文章目录

Matlab转C++程序出错调试

一. 背景:

一开始拿到两份代码时,觉得很难,开始的思路是觉得得把两份代码都看懂,然而发现matlab中有很多不认识的函数名,函数中也有不认识的函数名,说明文档也有复杂的公式。但其实真正去调试的时候发现并不需要知道原理,基本只要知道程序每一步在干什么就可以了

二. 思路:

考虑到代码数据量很大,循环2万次,矩阵大小200*200级别,在控制台输出信息比较效率很低,于是选择将矩阵输出到excel中,对比两份文件的结果,而在函数中对比输出变量则采取设断点调试

三. 主要问题:

  1. 矩阵输出到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);
  1. memset函数只能设置值为-1或者0,注意尤其不可以设置为1,要想设置为一,可以遍历一遍,暂时只想到这个方法
Memset(TempSX, 1, sizeof(TempSX)); //错误的做法
  1. 为提高效率循环体内有多次运算结合放在一起,但是没考虑到多次运算中一些数据的依赖性
    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就使用了两种方法的
  1. 其余错误是符号错误了如乘号写成减号,括号顺序不对
  2. matlab从一开始,C++从零开始

四. 思考

花了接近三天,觉得可以有更加提高效率的方法,尤其是比较excel时我是用人工加excel表格操作一份一份比较的,觉得可以用python更快且可以批量处理(不过其实也有想到后者也不一定效率太高,如果不够熟练的话)而在vs studio 与matlab中进行调试时使用分屏,一个界面里既要有代码查看又要有变量查看,视图不方便,当时操作很笨拙,暂时还没想到更好的方法。

标签:FLY,200,end,TX,FLX,C++,abs,matlab,出错
来源: https://blog.csdn.net/weixin_45440780/article/details/121567026

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有