1. 程式人生 > >C# matlab混合程式設計 MWArray使用筆記

C# matlab混合程式設計 MWArray使用筆記

這幾天突然想搞一搞以前沒有搞定的MATLABC#混合程式設計,今天把原來編寫的程式碼拿出來看看,然後結合網上一些正確的和一些錯誤的程式碼看看,最後詳細參考了MATLAB的幫助文件,總算搞定了C#MATLAB的混合程式設計。當然也不是完全搞定,僅僅完成了很小的一部分。總結一下,也就是熟悉MWArray.NET之間的資料型別轉換。下面就和大家分享一下吧。
檢視MATLAB提供一個最簡單的關於繪圖函式的例子,我先實踐了一下MATLAB中的程式碼,發現發現有問題,有點懷疑matlab幫助文件的程式碼有問題,雖然這種情況真的非常的少見,但是後來證明我的懷疑是正確的。MATLAB原來C#的程式碼大概是這樣的。

//二維陣列,Y=X^2
double[,] plotValue = new double[10, 2];
for (int i = 0; i < 10; i++)
{
plotValue[i, 0] = i;
plotValue[i, 1] = i * i;
}
//例項化Calculater物件
Calculater myCalculater = new Calculater();
//呼叫drawgraph方法
myCalculater.drawgraph((MWNumericArray)plotValue);
C#的程式碼中說起來也非常簡單,宣告一個二維陣列,使用for迴圈給每一個元素賦值,這個陣列的第
0列是X座標的值,陣列的第1列是Y座標的值,兩個座標的關係是Y=X^2。而MATLABm檔案的函式如下:
function drawgraph(coords)
plot(coords(1,:), coords(2,:));
MATLAB的程式碼的意思也很簡單,以coords矩陣的第1行的所有列為X座標,第2行的所有列為Y軸。在這裡一看發現了一個問題,我自己心裡想可能是matlab提供的範例似乎有點問題,C#建立的陣列是102列的,而drawgraph的函式似乎想接收一個210列的資料。這樣導致的兩個結果,第一,我個人總是得不到想要的結果,總給我畫一個空圖,這也是我上次嘗試的時候放棄的原因。第二,由於這個
debug存在,所以我就仔細研究了MWArray這個型別和與C#之間的型別轉換,這也是就是自學的快樂所在,解決一個問題還可以學到很多其他的東西,所以我每次都“樂此不疲”。
話說回來,如果把這個行列的關係搞清楚的話,就可以得到想要的結果。例如我把matlabm檔案重寫成這樣的形式
function drawgraph(coords)
plot(coords(:,1), coords(:,2),'*');
那麼這條拋物線就很自然的得到了,結果如圖所示啊。為了表達的清楚一點,我還把標記換成了*

問題了解決了,再來回顧一下前面的程式碼。在呼叫drawgraph方法時。plotValue這個double型別的陣列通過強制型別轉換轉化為了MWNumericArray。檢視drawgraph方法的資訊,函式的輸入輸出引數的型別,如下:
public void drawgraph(MathWorks.MATLAB.NET.Arrays.MWArray coords)
輸入的引數是一個MWArray型別的引數,而MWNumericArrayMWArray的派生類。我現在也覺得怪怪的函式的申明中明明函式的輸入引數是MWArray,而我把這個double陣列強制轉換成MWArray卻是總是提示編譯錯誤,無法進行強制型別轉換。
雖然上面的程式碼可以運行了,但是我又想是否可以通過構造方法構造出一個MWNumericArray型別的矩陣呢,答案當然是可以的。在VS的物件瀏覽器中查看了MWNumericArray各種構造方法,其中有一個構造方法是這樣的:
public MWNumericArray(MathWorks.MATLAB.NET.Arrays.MWArrayComplexity complexityparams int[]dimensions)
輸入的第一個引數是列舉型引數,有兩個值分別是Real,另一個是Complex;然後輸入矩陣的維數,由於有params關鍵字,所以可以建立指定大小的12維和3維矩陣。在這裡通過以下程式碼就可以構造一個MWNumericArray矩陣。
//使用構造方法,構造一個102列的實數矩陣
MWNumericArray plotValue = new MWNumericArray(MWArrayComplexity.Real, 10, 2);
接下來就是一段我“想當然”的程式碼:
for (int i = 0; i < 10;i++ )
{
plotValue[i, 0] = i;

plotValue[i, 1] = i*i;
}
但是編譯的時候,總是提示寫入或讀取了受保護的記憶體。經過幾次反覆我才驚醒過來,matlab中矩陣的下標是從1開始的,而C#是從0開始的。所以完整的程式碼是這樣的。(我還在國內的ilovematlab論壇,擔任simulink某個模組的版主,這個錯誤犯得真的不應該)。
//例項化Calculater物件
Calculater myCalculater = new Calculater();
//使用構造方法,構造一個102列的實數矩陣
MWNumericArray plotValue = new MWNumericArray(MWArrayComplexity.Real, 10, 2);
//注意該實數矩陣的下表從1開始
for (int i = 1; i <= 10;i++ )
{
plotValue[i, 1] = (i - 1);
plotValue[i, 2] = (i - 1) * (i - 1);
}
//呼叫drawgraph方法
myCalculater.drawgraph(plotValue);
經過這麼幾次折騰過後,成功構造了一個MWNumericArray型別的矩陣,如果現在強制轉換成MWArray是沒有問題了。這張想要的拋物線圖形也就出來了。
當前現在我還只是解決了陣列(矩陣)的輸入問題,當然還有陣列(矩陣)的輸出問題。這個留著下次再說吧。

相關推薦

C# matlab混合程式設計 MWArray使用筆記

這幾天突然想搞一搞以前沒有搞定的MATLABC#混合程式設計,今天把原來編寫的程式碼拿出來看看,然後結合網上一些正確的和一些錯誤的程式碼看看,最後詳細參考了MATLAB的幫助文件,總算搞定了C#和MATLAB的混合程式設計。當然也不是完全搞定,僅僅完成了很小的一部分。總結一下,也就是熟悉MWArray和.N

C++&MATLAB混合程式設計mwArray使用例項

這篇部落格主要介紹C++&MATLAB混合程式設計中mwArray型別的使用,並給出一個測試通過的小例子,終於如何生成混合程式設計中使用的.dll,.h等檔案,如何在專案中配置並呼叫不在本文中進行敘述。 mwArray是在C++專案中呼叫MATLAB函式時使用的資料

C# matlab混合程式設計時出現的異常解決方法

最近專案涉及到用編好的matlab函式生成dll檔案供C#呼叫,其中出現了許多問題,現在我將這些問題彙總,寫篇博文。 1.使用deploytool工具生成的dll檔案後,C#呼叫dll檔案出現“未找到或是無法載入dll”檔案的錯誤 此類錯誤一般都是.NET版本的錯誤,需

C語言與matlab混合程式設計mwArray的Get函式的簡單用法解釋

網上的通用示例: double data[4] = {1.0, 2.0, 3.0, 4.0}; double x; mwArray a(2, 2, mxDOUBLE_CLASS); a.SetData(data, 4); x = a.Get(1,1); // x = 1.0

QT之C++和QML混合程式設計學習筆記

QML中使用C++物件 建立一個測試用的C++物件 #ifndef PIECHART_H #define PIECHART_H #include <QtQuick/QQuickPaintedItem> #include <QColor> #include <

C#與matlab混合程式設計以及C#程式設計

把最近所做的C#與MATLAB混合程式設計,還有介面一些問題進行總結。MATLAB有非常強大的運算功能,C#有很多封裝好的庫可以用來做介面,所以利用兩者的優勢來製作一個c#呼叫MATLAB演算法程式的展示介面。 C#與MATLAB混合程式設計是整個專案中比較難的一部分,主要

國內第一部C#.Net呼叫Matlab混合程式設計視訊教程

一、視訊說明 在開放在這9個月時間裡,視訊下載了約800次,同時也發放了約500次的註冊碼。當初的想法是加密後,只能從我這裡拿到驗證碼,可以防止一部分奸商拿去某寶進行再次銷售,進行盈利活動,同時也可以統計視訊的使用人數。   值得注意的是,本套視訊教程和加密版本的稍有有一點剪輯上的區別,這

【5.1送禮】國內第一部MatlabC#.Net混合程式設計視訊教程【免費】

  上一次寫部落格很久了,一直在忙彩票分析系統架構的事情,寫部落格真是件費神的事情,非常花時間。今天抽空釋出這篇部落格,是為了開源一部自己錄製的視訊教程—Matlab和C#.Net混合程式設計視訊教程【入門級】。下面說說這部視訊教程的來由和一些事情,想獲取的仔細看看,別忘了點【推薦】哦! 一、為啥要

cMATLAB混合程式設計 mxArray矩陣賦值

在MATLAB裡邊定義 a = [1, 4, 2; 3, 2, 0]; 在C語言等效定義是 double a[2][3] = { 1, 3, 4, 2, 2, 0 };//c語言的陣列在記憶體裡邊是按行依次儲存的,而MATLAB的mxArray是按列依次儲存的 mxAr

學習筆記:Qt與Matlab混合程式設計及遇到的諸多問題(附DEMO)

工具:MATLAB R2014b,Qt 5.6.1, 目標:通過MATLAB寫一個簡單的函式,生成動態連結庫DLL,再在Qt上呼叫 1.在MATLAB主頁新建一個函式 記住函式的名字和儲存的函式檔案的名字要相同,比如我寫了一個函式f,儲存時檔名需要是f.m 2.生

c#與matlab混合程式設計時出現應用程式發生異常 未知的軟體異常(0xe0434f4d),位置為 0x7c812a7b.

   第一次寫部落格,詞語組織的不好,往大家莫噴,在進行c#與matlab混合程式設計時,當c#呼叫matlab生成的.dll時,讀取運算得到的結果時,遇到了應用程式發生異常 未知的軟體異常(0xe0434f4d),位置為 0x7c812a7b,我的問題出在讀取了一個不存在

C#與Matlab混合程式設計_入門

Author: [email protected] Copyright 2013, [email protected], All Rights Reserved. Date: 2013-11-07 C#與Matlab混合程式設計基礎過程。 參考:

MatlabC++和MATLAB混合程式設計-DLL篇

先小話一下DLL,DLL是動態連結庫,是原始碼編譯後的二進位制庫檔案和程式介面,和靜態連結庫不同的是,程式在編譯時並不連結動態連結庫的執行體,而是在檔案中保留一個呼叫標記,在程式執行時才將動態連結庫檔案載入入記憶體。並且DLL在執行時是共享的,即當多個程式呼叫時,記憶體中也只

FFT原理及C++與MATLAB混合程式設計詳細介紹

## 一:FFT原理 ### 1.1 DFT計算 在一個週期內的離散傅立葉級數(DFS)變換定義為離散傅立葉變換(DFT)。 $$ \begin{cases} X(k) = \sum_{n=0}^{N-1}x(n)W_N^{kn}, & 0 \le k \le {N-1} \\ x(n) = \frac

Matlab 混合程式設計資源1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

提高C++效能的程式設計技術筆記:多執行緒記憶體池+測試程式碼

為了使多個執行緒併發地分配和釋放記憶體,必須在分配器方法中新增互斥鎖。 全域性記憶體管理器(通過new()和delete()實現)是通用的,因此它的開銷也非常大。 因為單執行緒記憶體管理器要比多執行緒記憶體管理器快的多,所以如果要分配的大多數記憶體塊限於單執行緒中使用,那麼可以顯著提升效

提高C++效能的程式設計技術筆記:單執行緒記憶體池+測試程式碼

頻繁地分配和回收記憶體會嚴重地降低程式的效能。效能降低的原因在於預設的記憶體管理是通用的。應用程式可能會以某種特定的方式使用記憶體,並且為不需要的功能付出效能上的代價。通過開發專用的記憶體管理器可以解決這個問題。對專用記憶體管理器的設計可以從多個角度考慮。我們至少可以想到兩個方面:大小和併發。

提高C++效能的程式設計技術筆記:臨時物件+測試程式碼

型別不匹配:一般情況是指當需要X型別的物件時提供的卻是其它型別的物件。編譯器需要以某種方式將提供的型別轉換成要求的X型別。這一過程可能會產生臨時物件。 按值傳遞:建立和銷燬臨時物件的代價是比較高的。倘若可以,我們應該按指標或者引用來傳遞物件以避免生成臨時物件。 按值返回:如果編寫的函式是

提高C++效能的程式設計技術筆記:建構函式和解構函式+測試程式碼

物件的建立和銷燬往往會造成效能的損失。在繼承層次中,物件的建立將引起其先輩的建立。物件的銷燬也是如此。其次,物件相關的開銷與物件本身的派生鏈的長度和複雜性相關。所建立的物件(以及其後銷燬的物件)的數量與派生的複雜度成正比。 並不是說繼承根本上就是程式碼效能的絆腳石。我們必須區分全部計算開銷、

提高C++效能的程式設計技術筆記:虛擬函式、返回值優化+測試程式碼

虛擬函式:在以下幾個方面,虛擬函式可能會造成效能損失:建構函式必須初始化vptr(虛擬函式表);虛擬函式是通過指標間接呼叫的,所以必須先得到指向虛擬函式表的指標,然後再獲得正確的函式偏移量;內聯是在編譯時決定的,編譯器不可能把執行時才解析的虛擬函式設定為內聯。 無法內聯虛擬函式造成的效能損失