【这是笔者上一篇博客,本文提供另一种方式去解决调用matlab工具箱的问题】http://www.cnblogs.com/Erma/p/9349185.html
啥也不说了,上主要代码!
using DoSmoothPro;
using MathWorks.MATLAB.NET.Arrays;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace test_BPnetApp
{
public partial class Form1 : Form
{
List<double[]> specList1 = new List<double[]>();
List<double[]> specList2 = new List<double[]>();
List<double[]> trainList = new List<double[]>();
List<double[]> testList = new List<double[]>();
double[] origenalX, origenalY,smoothedY;
int femaleCount, maleCount;
//DoNetClass doNetClass = new DoNetClass();
MLApp.MLApp matlab = null;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 导入数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_loadTranData_Click(object sender, EventArgs e)
{
specList1.Clear();
femaleCount = 0;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "(*.txt)|*.txt|(*.*)|*.*";
ofd.RestoreDirectory = true;
ofd.Multiselect = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
String[] names = ofd.FileNames;
// List<Double> arr1 = new List<Double>();
List<Double> arr2 = new List<Double>();
for (int i = 0; i < names.Length; i++)
{
arr2.Clear();
femaleCount++;
FileStream fs = new FileStream(names[i], FileMode.Open);
StreamReader sr = new StreamReader(fs);
try
{
string line = sr.ReadLine();
while (line != null)
{
String[] a = line.Split(' ');
//arr1.Add(double.Parse(a[0]));
arr2.Add(double.Parse(a[1]));
line = sr.ReadLine();
}
//double[] bfwavelength = arr1.ToArray();
double[] bfspec = arr2.ToArray();
specList1.Add(bfspec);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
sr.Close();
fs.Close();
}
}
}
ofd.Dispose();
}
/// <summary>
/// 导入数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
specList2.Clear();
maleCount = 0;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "(*.txt)|*.txt|(*.*)|*.*";
ofd.RestoreDirectory = true;
ofd.Multiselect = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
String[] names = ofd.FileNames;
//List<Double> arr1 = new List<Double>();
List<Double> arr2 = new List<Double>();
for (int i = 0; i < names.Length; i++)
{
arr2.Clear();
maleCount++;
FileStream fs = new FileStream(names[i], FileMode.Open);
StreamReader sr = new StreamReader(fs);
try
{
string line = sr.ReadLine();
while (line != null)
{
String[] a = line.Split(' ');
//arr1.Add(double.Parse(a[0]));
arr2.Add(double.Parse(a[1]));
line = sr.ReadLine();
}
//double[] bfwavelength = arr1.ToArray();
double[] bfspec = arr2.ToArray();
specList2.Add(bfspec);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
sr.Close();
fs.Close();
}
}
}
ofd.Dispose();
}
/// <summary>
/// 导入测试数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_loadTestData_Click(object sender, EventArgs e)
{
testList.Clear();
//maleCount = 0;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "(*.txt)|*.txt|(*.*)|*.*";
ofd.RestoreDirectory = true;
ofd.Multiselect = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
String[] names = ofd.FileNames;
//List<Double> arr1 = new List<Double>();
List<Double> arr2 = new List<Double>();
for (int i = 0; i < names.Length; i++)
{
arr2.Clear();
//maleCount++;
FileStream fs = new FileStream(names[i], FileMode.Open);
StreamReader sr = new StreamReader(fs);
try
{
string line = sr.ReadLine();
while (line != null)
{
String[] a = line.Split(' ');
//arr1.Add(double.Parse(a[0]));
arr2.Add(double.Parse(a[1]));
line = sr.ReadLine();
}
//double[] bfwavelength = arr1.ToArray();
double[] bfspec = arr2.ToArray();
testList.Add(bfspec);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
finally
{
sr.Close();
fs.Close();
}
}
}
ofd.Dispose();
}
/// <summary>
/// 开始测试
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_test_Click(object sender, EventArgs e)
{
double[,] simdata = new double[512,testList.Count];
double[,] simdataIm= new double[512,testList.Count];
for (int i = 0; i < testList.Count; i++)
{
for (int j = 0; j < 512; j++)
{
simdata[j, i] = testList[i][j];
}
}
matlab.PutFullMatrix("simdata", "base", simdata, simdataIm);
matlab.Execute(@"sim_Ren = doSim(simdata)");
double[,] result = matlab.GetVariable("sim_Ren", "base");
for(int i=0;i<result .Length;i++)
{
richTextBox1.AppendText(result[0,i].ToString("f5")+"\r\n");
}
}
/// <summary>
/// 初始化matlab环境和工作路径,一定要先安装matlab才行。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
Type matlabAppType = Type.GetTypeFromProgID("Matlab.Application");
matlab = Activator.CreateInstance(matlabAppType) as MLApp.MLApp;
string command;
command = "clear all;";
matlab.Execute(command);
matlab.Visible = 0;
string path_project = Directory.GetCurrentDirectory(); //工程文件的路径,如bin下面的debug
command = "cd('" + path_project + "')"; //自定义matlab工作路径
matlab.Execute(command);
}
/// <summary>
/// 关闭matlab
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
string command2 = @"close all";
matlab.Execute(command2);
matlab.Quit();
}
/// <summary>
/// 初始化matlab,有时候有缓存在matlab环境中,用此方法清理。
/// 神经网络训练不好时,清理也没用,要关掉程序重新开始才训练的好效果。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void init_matlab_Click(object sender, EventArgs e)
{
string command2 = @"close all";
matlab.Execute(command2);
matlab.Quit();
Type matlabAppType = Type.GetTypeFromProgID("Matlab.Application");
matlab = Activator.CreateInstance(matlabAppType) as MLApp.MLApp;
string command;
command = "clear all;";
matlab.Execute(command);
matlab.Visible = 0;
string path_project = Directory.GetCurrentDirectory(); //工程文件的路径,如bin下面的debug
command = "cd('" + path_project + "')"; //自定义matlab工作路径
matlab.Execute(command);
}
/// <summary>
/// 导入数据后,开始训练
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_tran_Click(object sender, EventArgs e)
{
trainList.AddRange(specList1);
trainList .AddRange(specList2);
double[,] arraydata = new double[512, femaleCount + maleCount];
double[,] arraydataIm = new double[512, femaleCount + maleCount];
for (int i=0;i<femaleCount +maleCount;i++)
{
for(int j=0;j<512;j++)
{
arraydata[j,i] = trainList[i][j];
}
}
double[] femaleCountnum = { femaleCount };
double[] femaleCountIm = { 0 };
double[] maleCountnum = { maleCount };
double[] maleCountIm = { 0 };
matlab.PutFullMatrix("arraydata", "base", arraydata, arraydataIm);//第一个data表示存储的数据,第二个参数表示工作空间,第三个参数data表示输入数据的实部,第四个参数表示输入数据的虚部
matlab.PutFullMatrix("femaleCount", "base", femaleCountnum, femaleCountIm);
matlab.PutFullMatrix("maleCount", "base", maleCountnum, maleCountIm);
string command1;
command1 = "t=0:0.01:2*pi;y=sin(t);h=plot(t,y)";//matlab脚本命令行
String path = Directory.GetCurrentDirectory();//获取当前路径
matlab.Execute(command1);
matlab.Execute(@" createNet(arraydata, femaleCount, maleCount)");
}
}
}
一些需要注意的地方: