1. 程式人生 > >【原創】Matlab.NET混合程式設計技巧之找出Matlab內建函式

【原創】Matlab.NET混合程式設計技巧之找出Matlab內建函式

  Matlab與.NET的混合程式設計,掌握了基本過程,加上一定的開發經驗和演算法基礎,肯定不難。反之,有時候一個小錯誤,可能抓破腦袋,加班幾個晚上,除錯才能解決。同樣,由於Matlab.NET混編的特殊性,加上MathWorks的原因,英文文件和沒有披露一些詳細的細節(甚至不允許反編譯MWArray.dll,呵呵,它不允許,不代表你不會哦)。經過很多專案,和大量的實驗,也發現了一些小技巧和小祕密,今天就分享其中一個,先做一個簡單的鋪墊,下一篇將寫一個實際例子。

1.Matlab.NET混編小技巧

常規混編時,比如我們要呼叫plot函式進行繪圖,肯定是先自己寫一個m函式,把plot封裝一下,根據自己的需要,傳遞資料和引數。實際上,對於Matlab的內建函式,是不需要這麼做的。也就是說,對於Matlab的內建函式,是可以直接在C#中進行呼叫的,只要傳遞的引數符合要求,就可以得到結果。

2.什麼是Matlab的內建函式

本文所說的Matlab內建函式,就是Matlab所謂的"built-in MATLAB function"。

在Matlab中,可以使用exist返回一個名稱或者函式的狀態,比如是工作區的變數,搜尋路徑的m函式,dll檔案或者內建函式。

比如,我們可以使用exist 來檢視plot函式的資訊:

1 >> exist plot
2 
3 ans =
4 
5      5

可以看到,值為5,返回5說明就是"built-in MATLAB function"。從Matlab的組成來看,這些built-in MATLAB function應該都是matlab的核心函式,因此,也應該都包含在MCR中,因此這是一個直接可以呼叫的理由吧。

 3.Matlab有哪些內建函式

在發現上述小技巧之後,本人親自對其中幾個內建函式進行了測試,證明其是可以在C#中直接呼叫,然後,我就想,到底有Matlab有多少個內建函式,函式名稱有是什麼?在把Matlab Help翻了很久之後,依舊沒有結果。只是猜測,可能太多了,Matlab也沒有特別說明吧。那怎麼辦,只能自己動手了(自己動手豐衣足食)。

說說找出內建函式集合的過程吧。

1.首先內建函式應該在核心的計算引擎中,外部工具箱的函式應該不屬於(不排除其他工具箱中有部分函式也是內建函式)。

2.使用Matlab Help瀏覽器,開啟核心元件Matlab的Functions節點,可以看到下面這些函式分類:

  

3.手動將這些大類中的函式手動複製到一個txt文字中,當然格式可能有點亂,不用管。

4.使用C#編寫一個簡單的函式,將上述txt文字進行處理,把函式名都截取出來,放到一個新的result.txt中。程式碼如下:

 1 using System;
 2 using System.Text ;
 3 using System.IO ;
 4 
 5 namespace FunctionNameProcess
 6 {
 7     class Program
 8     {
 9         public static void Main(string[] args)
10         {
11             string fileName = @"funcname.txt" ;
12             string saveName = @"result.txt";
13             TextWriter tw = new StreamWriter (saveName ,false );
14             using (TextReader tr = new StreamReader (fileName ))
15             {
16                 string temp ;
17                 while ((temp = tr.ReadLine ())!=null )
18                 {
19                     tw.WriteLine (GetBulidInFunction (temp ));
20                 }                                
21             }            
22             tw.Close ();
23             Console.Write("Press any key to continue . . . ");
24             Console.ReadKey(true);
25         }
26         
27         public static string GetBulidInFunction(string name)
28         {
29             if (name !="") {
30                 string[] names = name.Split ('\t');
31                 if (names!=null && names [0]!= "") {
32                     return names [0];
33                 }
34             }    
35             return "";            
36         }
37     }
38 }

5.最後在matlab中編寫一個簡單的批處理程式碼,迴圈驗證result.txt中的函式名的資訊,是否屬於內建函式即可。matlab程式碼如下:

 1 %匯入資料後是cell型別的資料型別
 2 %要進行轉換為字串陣列然後呼叫exist函式進行計算
 3 %最終結果也應該是字串陣列,需要宣告,新增過程中型別不一樣會有錯誤
 4 clc;clear;
 5 newData = importdata('result.txt');
 6 vars = fieldnames(newData);
 7 for i = 1:length(vars)
 8     assignin('base', vars{i}, newData.(vars{i}));%在名稱空間宣告變數
 9 end
10 result = {};%宣告一個空的cell陣列型別
11 for i = 1:size(textdata,1)
12     temp =cell2mat(textdata(i,1));
13     resultNo = exist(temp);
14     if resultNo == 5 %返回5說明為內建函式
15         len = size(result,1);
16         result(len+1,1) = mat2cell(temp);
17     end
18 end

OK,可以在result中看到屬於內建函式的名稱了。剩下的怎麼辦看你的了,本來想把這些函式都一一翻譯出來,可惜太大了,有1000多個,最後放棄了,把這個技巧分享給大家,“授人以魚不如授人以漁”,大家掌握了方法,其實也不難了。

備註:上面也提到了,其實也有可能其他工具箱也有一些內建函式,但工作量太大,沒有全部測試,只是猜測一下,大家以後混編的時候,可以先用exist檢測一下即可。至於這些核心元件中的內建函式,我也只測試了其中幾個,理論上應該都是可以直接呼叫的,也不排除有些函式由於其他原因不能用啊,大家對症下藥吧。

下次將分享如何在C#中直接呼叫這些內建函式,而不需要封裝。

相關推薦

原創Matlab.NET混合程式設計技巧Matlab函式

  Matlab與.NET的混合程式設計,掌握了基本過程,加上一定的開發經驗和演算法基礎,肯定不難。反之,有時候一個小錯誤,可能抓破腦袋,加班幾個晚上,除錯才能解決。同樣,由於Matlab.NET混編的特殊性,加上MathWorks的原因,英文文件和沒有披露一些詳細的細節(甚至不允許反編譯MWArra

原創Matlab.NET混合程式設計技巧直接呼叫Matlab函式

  在我的上一篇文章【原創】Matlab.NET混編技巧之——找出Matlab內建函式中,已經大概的介紹了matlab內建函式在混合程式設計中的優點,並通過程式找出了matlab中的大部分內建函式,當然更多人關心是如何像我所說得那樣,不用直接編譯,就直接在C#中呼叫這些內建函式。本文就帶你揭開這些謎團

原創開源.NET排列組合元件KwCombinatorics使用(二)——排列生成

前言   本文今天介紹的.NET開源元件是KwCombinatorics,它是.NET平臺一個高效的生成排列組合序列的開源類庫,它提供了4種生成排列與組合序列的方式。雖然原理和功能都很簡單,但是這個類庫在軟體測試、組合數學以及密碼學等方面都有很大的用處。很早就接觸了這個類庫,以前在一些小程式

原創開源.NET排列組合元件KwCombinatorics使用(三)——笛卡爾積組合

前言   本文今天介紹的.NET開源元件是KwCombinatorics,它是.NET平臺一個高效的生成排列組合序列的開源類庫,它提供了4種生成排列與組合序列的方式。雖然原理和功能都很簡單,但是這個類庫在軟體測試、組合數學以及密碼學等方面都有很大的用處。很早就接觸了這個類庫,以前在一些小

原創開源.NET排列組合元件KwCombinatorics使用(一)—組合生成

1.Combination類基本介紹   Combination類是根據指定的物件列表,依次升序選擇非重複數字的組合序列,重複是什麼意思呢?就是指定序列中的元素不重複選擇2次。舉個例子:從 0,1,2,3這4個數中,取出3個元素組成序列,那麼共有這麼幾種組合方式:{0,1,2},{0,1,3},{0,2

轉載關於Python混合程式設計時的記憶體洩露

       登陸論壇  | 論壇註冊| 加入收藏 | 設為首頁| RSS      首頁Linux頻道軟體下載開發語言嵌入式頻道開源論壇 | php | JSP | ASP | asp.net | JAVA | c/c++/c# | perl | JavaScrip

原創基於.NET的輕量級高效能 ORM - XFramework

 【前言】   接上一篇《【原創】打造基於Dapper的資料訪問層》,Dapper在應付多表自由關聯、分組查詢、匿名查詢等應用場景時不免顯得吃力,經常要手寫SQL語句(或者用工具生成SQL配置檔案)。試想一下,專案中整個DAL層都塞滿了SQL語句,對於後期維護來說無異於天災人禍,這個坑誰踩誰知道。

轉載fiddler抓包小技巧自動儲存抓包資料(可根據需求過濾)

說起這個抓包啊,大家都不陌生。辣麼,將自己抓獲的資料儲存下來進行資料分析就是個問題了。一般情況下,這個軟體就是操作軟體的,設定自動儲存的話,只能依靠軟體自身來設定。但是呢,這個fiddler不得不讓我們又一次見識到了它的強大。廢話不多說,咱們直接來看配置哈。 首先: 然後選擇:

原創東方耀react native學習-37AsyncStorage

AsyncStorage是一個簡單的、具有非同步特性的鍵值對的儲存系統,全域性的!替代LocalStorage AsyncStorage裡面都有一個回撥函式,而回調的第一個引數都是錯誤物件,如果發生錯誤,該物件就會展示錯誤資訊,否則為null;每個方法都會返回

原創探索Newlife X元件利器:XCoder點滴[附下載]

  XCode讓我一個外行業餘者轉變為一個半專業的開發人員,心懷感激,讓我把更多的精力關注在業務,而不是資料庫,儲存過程,sql,以及編寫一遍一遍的垃圾程式碼。在這裡我不對Newlife XCode做過多介紹,XCode曾經是一個輕量級ORM元件,現在XCode加上XCoder,變成了一個非常強大的資

原創探索雲端計算容器底層Namespace

一、先談談程序 在正式介紹Namespace之前,先介紹下程序,因為容器本質上是程序,但是在介紹程序之前,先理清下“程式”和“程序”的關係,這是IT從業人員在日常工作中經常碰到的兩個詞彙,舉個通俗點的例子幫助大家理解,“程式”可以看成是一張機械圖,圖上的內容都是手工畫上去的,相當於是計算機的輸入,在機械圖未正

5.1送禮國內第一部Matlab和C#.Net混合程式設計視訊教程免費

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

原創開源Math.NET基礎數學類庫使用(03)C#解析Matlab的mat格式

前言   本人在09年使用該元件的時候,主要原因也是為了替代Matlab,進行相關數學計算,現在依然有很多人關注Matlab計算,特別是學生,而很多也在使用C#,所以這些人通常由於個人能力有限(無法精通某一個門語言來解決綜合問題),無法單純的通過C#或者Matlab來解決問題,就想通過混合程式設計來

Asp.Net頁面傳值的方法簡單總結原創

tid 周期 () 路徑 coo webp 方式 qpi 優點 1、QueryString 當頁面上form按照get的方式向頁面發送請求數據的時候,web server會將請求數據放入 一個QEURY_STRING的環境變量中,然後通過QeueryString方法

原創《笨辦法學python》(12)----關於python的---程式設計語法---基礎概念

  全都是物件 變數,函式名都只是引用 標籤 深淺複製   都是從右往左邊執行? 好從左往右的計算次序有衝突嗎       因為是第一門自己學的程式語言 學python的時候,我需要搞清楚很多概念

原創如何解決java.net.SocketException 異常問題

今天在論壇上看到這問題的帖子,感覺這個問題值得總結一下 希望對自己和大家有所幫助 我在插入新聞的時候,伺服器出現如下錯誤 ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: Connection re

原創開源Math.NET基礎數學類庫使用(02)矩陣向量計算

前言   本文開始一一介紹Math.NET的幾個主要子專案的相關功能的使用。今天先要介紹的是最基本Math.NET Numerics的最基本矩陣與向量計算。 1.建立Numerics矩陣與向量   矩陣與向量計算是數學計算的核心,因此也是Math.NET Numerics的核心和基礎。  

原創.NET讀寫Excel工具Spire.Xls使用(3)單元格控制

  前一篇文章:“.NET讀寫Excel工具Spire.Xls使用(2)Excel檔案的控制”給大家介紹了C#使用Spire.XLS來控制Excel檔案的基本功能和相關實踐程式碼。這篇文章將重點介紹C#操作Excel檔案時,對Excel單元格的控制。   以前在使用NPOI的時候,其實印象最深的還是

原創開源Math.NET基礎數學類庫使用(08)C#進行數值積分

  在數值計算的需求中,數值積分也是比較常見的一個。我們也知道像Matlab,Mathematics等軟體的積分求解功能非常高大上,不僅能求解定積分,還能求解不定積分,甚至多重積分等等。而Math.NET這個元件沒有如此高階的功能,目前也只提供了比較件的閉區間上的定積分求解功能。今天就一起來看看,因為不定

原創.NET讀寫Excel工具Spire.Xls使用(1)入門介紹

  在.NET平臺,操作Excel檔案是一個非常常用的需求,目前比較常規的方法有以下幾種: 1.Office Com元件的方式:這個方式非常累人,微軟的東西總是這麼的複雜,使用起來可能非常不便,需要安裝Excel,對於伺服器,有時候還需要為配置IIS許可權。折騰人,看到很多人在群裡面使用這個東西,出現各種抓