NET与Matlab结合 —— 最小二乘法直线拟合(C#)

转载 2007年09月21日 09:23:00

NET与Matlab结合 —— 最小二乘法直线拟合(C#)  首先是一个.m文件drawgraph.m,确保它能够在Matlab里运行。

我这里是最小二乘法直线拟合程序。

%最小二乘法直线拟合
%Created by Safirst C. Ke 2007.8.29 Wed 14:51

function drawgraph(coords)
%传入的参数为两行向量,第一行为x坐标,第二行为坐标。

%axis ([0 100 0 100]);
grid on;
hold on;

%显示欲拟合的点的位置
plot(coords(1,:), coords(2,:), '*');

%分解x,y坐标
x = coords(1,:)
y = coords(2,:)'

b = size(coords);
c = ones(1, b(2));
 
 MT = [c; x];
 M = MT';
 
 %f为直线函数,f = mx + b;
 f = inv(MT * M) * MT * y
 ['y = ', num2str(f(2)), 'x + ', num2str(f(1))]

 
 %显示最终拟合的直线
 x = -max(x):max(x);
 y =  f(1) + f(2) * x;
 
 
 plot(x, y);
 xlabel('X轴');
 ylabel('Y轴');
 title('最小二乘法直线拟合 by Safirst C. Ke');
 
 legend(['y = ', num2str(f(2)), 'x + ', num2str(f(1))]);

然后将这个文件包含在.NET的类库工程中,并进行编译。

这里需要理解它的过程,毕竟.NET不能编译.m文件。怎么做到的呢?

通过设置这个工程的生成事件属性,添加为

call PlotDemoBuild.bat

然后在PlotDemoBuild.bat这个文件里面写好用Matlab编译器mcc编译的命令行,最重要的部分就是

mcc -M -silentsetup -vg -B "dotnet:PlotDemoComp,Plotter,2.0,private" -d ../../src ../../drawgraph.m

这样的话,点击生成,就会通过mcc产生dll,即我们需要的类库。

然后建立我们真正的C#工程,添加引用为刚才的类库,并开始写程序program.cs

using System;
using System.Collections.Generic;
using System.Text;

using MathWorks.MATLAB.NET.Utility;    

using MathWorks.MATLAB.NET.Arrays;  

//这两个引用显然要添加,不过好在这两个命名空间属于一个库MWArray.dll

//C:/Program Files/MATLAB/R2007a/toolbox/dotnetbuilder/bin/win32/v2.0/MWArray.dll

using PlotDemoComp;

namespace ConsoleApplication2
{
    class Program
    {
        //[STAThread]
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Please Input the points you want to fit:");

                string[] y = Console.ReadLine().Trim().Split();

                int size = y.Length;
                double[] x = new double[size];
                for(int i = 0; i < size; i++)
                {
                    x[i] = Convert.ToDouble(y[i]);
                }

                double[,] pointValues = new double[2, size / 2];

               //从开头算起,相邻的两个数为一个点,所以x和y都是间隔一个的。如1,2,3,4代表两点(1,2),(3,4)

                for(int i = 0; i < size; i += 2)   

                {
                    int index = i / 2;
                    pointValues[0, index] = x[i];
                }
                for(int i = 1; i < size; i += 2)
                {
                    int index = (i - 1) / 2;
                    pointValues[1, index] = x[i];
                }
                Plotter plotter = new Plotter();
                plotter.drawgraph((MWNumericArray)pointValues);
                Console.ReadLine();
            }
            catch(Exception exception)
            {
                Console.WriteLine("Error: {0}", exception);
            }
        }
    }
}

运行结果如下:

Please Input the points you want to fit:
1 2 3 4 5 6 -1 -2 -3 -4 -5 -6

*号标记欲拟合的点,直线为拟合直线!

就写这么多,以后再加入一个曲线拟合的程序。

特别声明:在下学习.NET C#和Matlab的时间均不超过1个月,

望高手不要批评指责,照顾一下新手学习钻研的积极性! 

最小二乘法直线拟合及其Matlab实现

最小二乘法,通常用在我们已知数学模型,但是不知道模型参数的情况下,通过实测数据,计算数学模型,例如,在题目中,数学模型就是直线方程y=ax+b,但是不知道直线方程的a和b。     本来呢,我们只需...
  • cp32212116
  • cp32212116
  • 2014年12月10日 16:47
  • 10146

最小二乘法 拟合平面直线

前言:     最近要实现一个算法,“对一系列点拟合出一条线,且区分出不属于改线的点”。在网上找了许多资料,用数学公式解释原理以及用matlab实现的居多,本文章主要解释用最小二乘法的进行点拟合成线,...
  • ouyangying123
  • ouyangying123
  • 2017年01月03日 19:15
  • 2838

最小二乘法实现直线拟合

注解:原理和代码均非本人所创,代码转自:Ziv Yaniv 所写的ransac算法中的最小二乘法实现。 原理实现如下: 转载自:http://www.cnblogs.com/gnuhpc/arch...
  • jia_zhengshen
  • jia_zhengshen
  • 2014年01月23日 15:47
  • 2225

最小二乘法拟合直线-C++实现

最近公司的一个项目需要计算TVDI(Temperature Vegetation Dryness Index ,温度植被干旱指数) ,TVDI的计算公式如下(具体原理自行百度): 其中,为任意像...
  • pl20140910
  • pl20140910
  • 2016年07月16日 22:42
  • 4645

最小二乘法拟合直线

曲线拟合中最基本和最常用的是直线拟合。设x和y之间的函数关系为:                    y=a+bx 式中有两个待定参数,a代表截距,b代表斜率。对于等精度测量所得到的N组数据(x...
  • lihuajie1003
  • lihuajie1003
  • 2015年10月24日 17:45
  • 654

最小二乘法拟合直线

为了求取两组数据之间的关联时,经常会采用曲线拟合的方式去求得两组数据之间的关系表达模型,曲线拟合中最基本和最常用的是直线拟合。设x和y之间的函数关系为:                    y=a...
  • owen7500
  • owen7500
  • 2016年04月09日 10:25
  • 1205

关于Matlab中的线性与非线性最小二乘拟合

1、线性最小二乘拟合 最小二乘法(又称最小平方法)是一种数学优化技术,其通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的...
  • u012117071
  • u012117071
  • 2015年08月24日 11:17
  • 3585

matlab_最小二乘法数据拟合

定义: 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最 小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可 以简便地求得未知的数据,并使得这些求得的数据与实际数据之 ...
  • baidu_34604003
  • baidu_34604003
  • 2016年06月30日 00:54
  • 6756

最小二乘法用于直线,多项式,圆,椭圆的拟合及程序实现

参考: http://blog.csdn.net/jairuschan/article/details/7517773/
  • piaoxuezhong
  • piaoxuezhong
  • 2017年03月31日 13:05
  • 1636

MATLAB 空间三维散点数据的线性拟合

转载:http://blog.csdn.net/shenziheng1/article/details/51030700 [cpp] view plain copy   ...
  • qq_37917868
  • qq_37917868
  • 2017年03月26日 23:55
  • 1982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NET与Matlab结合 —— 最小二乘法直线拟合(C#)
举报原因:
原因补充:

(最多只允许输入30个字)