matlab转C++程序出错调试

2022/1/2 20:08:03

本文主要是介绍matlab转C++程序出错调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

      • Matlab转C++程序出错调试
        • 一. 背景:
        • 二. 思路:
        • 三. 主要问题:
        • 四. 思考

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中进行调试时使用分屏,一个界面里既要有代码查看又要有变量查看,视图不方便,当时操作很笨拙,暂时还没想到更好的方法。



这篇关于matlab转C++程序出错调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程