程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 在c#中提取matlab傳出的多個參數

在c#中提取matlab傳出的多個參數

編輯:C#入門知識

  苦逼的幫別人弄畢設,用的還是自己不會的C#語言,哎,搗鼓了許久,今天終於幫ta快弄完了。今天寫博文當然不是來說這些,而是寫一點小心得。如題,如何在c#中提取matlab傳出的多個參數。

  c#沒學過,但學過C++,還好,不是文盲。matlab也用過,但不是很熟。今天碰到的事情就是如何在C#中調用matlab。

  首先就是配置了,先從別人那學習一些經驗。

  朋友電腦配置列表:

(1)Microsoft Visual Studio 2010

(2)Matlab R2012a

(3)window7


1、安裝:

  首先安裝Matlab;

  安裝Visual Studio;

  安裝MCRInstall.exe,我安裝完Matlab之後在這裡找得的:C:"Program Files\MATLAB\R2012a\toolbox\compiler\deploy\win32

配置路徑:

  點擊:我的電腦-屬性-高級-環境變量-系統變量-PATH-編輯,在變量值輸入框中,不要刪除以前的字符串,在最前面加入MCR的安裝路徑,如:C:"Program Files\MATLAB\MATLAB Compiler Runtime\v80\bin\win32;

  確定、保存、重啟電腦。

2、  在matlab的Command window中輸入mbuild -setup顯示如下


>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers [y]/n?
n %選擇n

 Select a compiler:
[1] Lcc-win32 C 2.4.1
[2] Microsoft Visual C++ 6.0
[3] Microsoft Visual C++ .NET 2003
[4] Microsoft Visual C++ 2005
[5] Microsoft Visual C++ 2005 Express Edition
[6] Microsoft Visual C++ 2008
[7] Microsoft Visual C++ 2010
[0] None Compiler:
4 %選擇4,其他編譯器可以選相應的選項,我沒有驗證過

The default location for Microsoft Visual C++ 2010compilers is C:\Program Files\Microsoft Visual Studio 10, but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio 10.0 anyway [y]/n?
y%選擇y,因為ta的電腦安裝都比較本分,都是默認路徑

Please verify your choices: Compiler: Microsoft Visual C++ 20010 Location: C:\Program Files\Microsoft Visual Studio 10.0 Are these correct [y]/n? y %看上述信息,如果正確選擇y
Warning: MBUILD requires that the Microsoft Visual C++ 10.0 directories "VC" and "Common7" be located within the same parent directory. MBUILD setup expected to find directories named "Common7" and "VC" in the directory: "C:\Program Files\Microsoft Visual Studio 10". Trying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2010a\compopts.bat From template: C:\PROGRA~1\MATLAB\R2010a\bin\win32\mbuildopts\msvc80compp.bat
Done . . . 到此matlab編譯器設置成功。 3、 編寫m文件:


function d=analyse(filePath,rate,pace)
%d(1):walk_rateX,步頻
%d(2):step_lengthX:步長
%d(3):step_lengthZ:步幅

%filePath:文件的存儲路徑,請使用絕對路徑,string類型
%rate:采樣率,int類型
%pace:走路速度,double或float類型

% clear all;
A=load(filePath);
B=A';

x=B(3,:);
% y= B(4,:);
z= B(5,:);

% x=B(12,:)-10;
% y= B(13,:);
% z= B(14,:);


figure
plot(x,'r');
grid on;
title('x軸方向加速度');

% figure
% plot(y,'g');
% grid on;
% title('y軸方向加速度');

figure
plot(z,'b');
grid on;
title('z軸方向加速度');

[resultX,lagsX] = xcov(x,'unbiased');
% [resultY,lagsY] = xcov(y,'unbiased');
[resultZ,lagsZ] = xcov(z,'unbiased');

Y=resultX;
s=kalman(Y);
resultX=s;
scatterDataX=show(resultX,'x軸方向加速度 自相關系數');

[walk_rateX,step_lengthX]=gaitPara(scatterDataX,rate,pace);

d=[];
d(1)=walk_rateX;
d(2)=step_lengthX;

% figure
% plot(resultY,'g');
% grid on;
% title('y軸方向加速度 自相關系數');

Y=resultZ;
s=kalman(Y);
resultZ=s;
scatterDataZ=show(resultZ,'z軸方向加速度 自相關系數');
[walk_rateZ,step_lengthZ]=gaitPara(scatterDataZ,rate,pace);
d(3)=step_lengthZ;

end代碼比較丑,還有其它幾個文件,沒貼出來。

4、建立matlab工程

在matlab中點擊“File- new -Development Project” 自己選擇項目保存目錄和項目名,如E:"和magicpro.prj 類 型選擇.NET Component(忘記是什麼了,反正名字有點改了,但還是和.NET最接近的一個),如果你要生成更通用的COM組件,選擇Generic COM Component。添加剛才的m文件到這個新建的項目中去。點擊Build the project按鈕(這個按鈕的圖標和微軟開發工具的Build圖標一樣)或者右擊選擇“build”,等待3,4分鐘。建立成功。

5、C#中引用,主要是button4_Click()這個方法


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MathWorks.MATLAB.NET.Arrays;//這裡要去剛才安裝的那個tool下面找對應的dll,再引入
using butaipro;//這個也需要去剛才建立的matlab工程中找對應的dll文件

namespace test
{
    public partial class Form2 : Form
    {
        PersonDB personDB = null;
        public Form2()
        {
            InitializeComponent();
            personDB = new PersonDB();
          
        }


        private void button1_Click(object sender, EventArgs e)
        {
            frmDesign frm = new frmDesign();
            this.Hide();
            frm.Show();
        
        }

   
        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Person person = personDB.getPersonInfo(Class1.id);
            if (null != person)
                MessageBox.Show("the info is:\n" +person.toStirng());
            else
                MessageBox.Show("查無此人");

           //Form3 frm=new Form3();
           //frm.Text = TextBox + personDB.Select();


            //frmMain frm = new frmMain();
            //this.Hide();
            //frm.Show();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            butaipro.analysis m= new analysis();
            MWArray[] argsout = new MWArray[1];
            MWArray[] argsin = new MWArray[] { "C:/data/1.txt" ,50,1.2};
            m.analyse(3, ref argsout, argsin);

            MWNumericArray rate = argsout[0] as MWNumericArray;
            MWNumericArray race_length = argsout[1] as MWNumericArray;
            MWNumericArray race_range = argsout[2] as MWNumericArray;

            String s_rate = rate.ToString();
            String s_race_length = race_length.ToString();
            String s_race_range = race_range.ToString();

            MessageBox.Show("步頻=" + s_rate + "\n步長=" + s_race_length + "\n步幅=" + s_race_range);
        }

       
    }
}

這樣就算是一個可以使用的流程了。但是,當matlab中返回的有多個函數時button4_Click()這個方法就要小心了。

6、在c#中提取matlab傳出的多個參數

從我上面給出的matlab代碼可以看到,返回的是一個數組,經過一個小時的抓狂,button4_Click()中的方法可以獲取該數組中的內容了。但如果是返回多個矩陣是,該怎麼辦?下面是度娘中某位“度哥”的經驗:

?//輸入這裡想傳入的2個輸入參數,為了支持矩陣好通用,所以得弄成Array
double[] a = { 1, 2, 3, 4, 5, 6 };//輸入參數1
double[] b = { 2, 4, 6, 8, 10, 12 };//輸入參數2
double[,] c = new double[3, 2];//輸出參數1
double[,] d = new double[3, 2];//輸出參數2
//這些參數都是矩陣
MWNumericArray ma = new MWNumericArray(3, 2, a);//轉換成matlab需求的格式
MWNumericArray mb = new MWNumericArray(3, 2, b);
//輸出參數是一個MWArray數組
MWArray[] agrsOut = new MWArray[2];//兩個輸出參數,一定要寫數量
//輸出幾個輸出參數可以是不同類型的,比如第一個元素是矩陣,第二個是數值
//同理,輸入參數也是一個MWArray數組
MWArray[] agrsIn = new MWArray[] { ma,mb};
//調用函數,輸出參數需要加 ref 關鍵字
myFun.MatrixOpera(2, ref agrsOut, agrsIn);//2表示輸入參數的個數,輸出結構都在argsOut中,類似於c的指針參數輸入
//轉換得到實際的輸出參數
 MWNumericArray x1 = agrsOut[0] as MWNumericArray;
 MWNumericArray x2 = agrsOut[1] as MWNumericArray;
 c = (double[,])x1.ToArray();
 d = (double[,])x2.ToArray();
//一定要注意最後c和d的轉化,不同類型的轉換差異很大厄
//ToArray()對應n*m的數組
//ToScalarDouble()對應單個數值
//ToVetor()對應1維數組
  經過苦苦折磨,發現他裡面的有些注釋是致命的誤讀,最主要的就是:

myFun.MatrixOpera(2, ref agrsOut, agrsIn); //2表示輸入參數的個數,輸出結構都在argsOut中,類似於c的指針參數輸入

 這個2,不是輸入參數的個數,是輸出參數的個數,這裡表示的是,我輸出的是兩個MWNumericArray 數組....

當然,接下來就一馬平川了,該如何就如何....

 

匆忙寫下來,總感覺自己就是個CV戰士,但沒辦法,自己懂得東西太少了,只能借助於大量的網絡巨人的力量,希望自己以後可以改進.......

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved