1. 程式人生 > >【原創】Matlab.NET混合程式設計技巧之直接呼叫Matlab內建函式

【原創】Matlab.NET混合程式設計技巧之直接呼叫Matlab內建函式

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

宣告,這篇文章是需要一點點混合程式設計基礎的,基本概念和過程要懂一點,如果能簡單成功混編一個簡單的計算或者繪圖例子,可以更容易理解。

1.傳統的Matlab.NET混合程式設計步驟

傳統的Matlab.NET混合程式設計有2種方式:

1)Matlab編寫好M函式,利用deploytool編譯m函式生成dll,在C#專案中引用並呼叫;

2)基於介面的編寫方式,也是利用deploytool工具,過程繁瑣一點,對程式設計人員素質要求高一點,但不需要進行繁瑣的資料型別轉換。我的部落格有一篇文章專門介紹了這個混合程式設計方式,也有例子,大家有興趣的可以看看:http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.html

 不管上面用哪種方式,Matlab和C#混編的基本步驟,大概都是下面的過程: 

1) 編寫M函式,並首先在Matlab中測試是正確可以呼叫的。注意命名規範,註釋規範; 

2) 使用命令開啟 deploytool工具,設定專案名稱,選擇型別:.NET Assembly,然後新建一個類,並新增編寫好的M函式 

3) 編譯,生成dll,並在C#專案中新增引用(還需要引用對應版本的MWArray),利用物件瀏覽器檢視生成dll的方法結構,並根據Matlab和C#的型別轉換規則,進行資料轉換即可, 如果是介面的程式設計,這個過程相對要簡單。

2.深入解析傳統混編所生成的程式碼

2.1 第一步:編寫M函式,並測試可以使用

為了好我們今天的目的相匹配,特意封裝一個簡單的內建函式,plot,來畫一個簡單的圖形,如下所示M函式    

1 function PlotTest(n)
2 %編寫一個簡單的函式,對plot進行簡單封裝一下
3 plot(1:n,1:n);
4 %測試正確,才可以進行下一步工作

注意,混編必須是m函式function的形式才能被呼叫。上述函式簡單測試一下,沒有問題(複雜的函式一定要多測試,否則後續除錯非常困難)。繼續下一步。

2.2 第二步:在Matlab中使用deploytool建立混編專案

 在Matlab工作區輸入命令:deploytool,然後得到下面介面,輸入混編專案的名稱,選擇儲存位置,關鍵的是型別那裡一定要選擇".NET Assembly"。如下圖所示:

選擇“OK”之後,下一步matlab介面右側會出現專案解決方案,需要新增類名稱和M檔案。這個類名稱,就是編譯完成之後C#專案中的類物件名稱,然後新增我們剛才上一步編寫的“PlotTest.m”,然後編譯即可,如下圖所示:

到此為止,一個常規 簡單的Matlab.NET混編已經完成了60%了。編譯完成之後,開啟“Package”選項卡,即可看到生成的dll檔案,然後點選右鍵,開啟資料夾即可,如下圖所示:

2.3 檢視混編生成的程式碼

  這個過程很關鍵,其實包含很多資訊,只不過95%以上的人都沒有注意到其實混編生成的dll是有原始檔的,通過檢視原始檔就應該知道混編的原理,只不過這是matlab自動生成 而已。那看看生成的原始碼吧。

  開啟Matlab混編專案的目錄,可以看到有2個資料夾,"distrib”,“src”2個資料夾。"distrib"資料夾就是上面圖中生成的dll,注意有2個dll,1個是“專案名稱.dll”,一個是“專案名稱Native.dll”,這2個dll的差別可以通過"distrib"資料夾原始碼來觀察。“distrib”就是原始碼的資料夾。如下圖所示,src資料夾的檔案示意圖:

 我們2.2中新建的類名是TestDemo,所以生成的的原始碼名稱也是TestDemo,看看這2個cs檔案中的程式碼,同時類的方法也可以在VS中通過物件瀏覽器來檢視dll有哪些方法以及方法的引數型別。直接貼這2個cs檔案的程式碼,順便解釋和對比下:

TestDemo.cs檔案原始碼:

  1 /*
  2 * MATLAB Compiler: 4.17 (R2012a)
  3 * Date: Mon Sep 09 16:19:01 2013
  4 * Arguments: "-B" "macro_default" "-W" "dotnet:PlotTest,TestDemo,0.0,private" "-T"
  5 * "link:lib" "-d" "D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest\src" "-w"
  6 * "enable:specified_file_mismatch" "-w" "enable:repeated_file" "-w"
  7 * "enable:switch_ignored" "-w" "enable:missing_lib_sentinel" "-w" "enable:demo_license"
  8 * "-v" "class{TestDemo:D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.m}" 
  9 */
 10 using System;
 11 using System.Reflection;
 12 using System.IO;
 13 using MathWorks.MATLAB.NET.Arrays;
 14 using MathWorks.MATLAB.NET.Utility;
 15 
 16 #if SHARED
 17 [assembly: System.Reflection.AssemblyKeyFile(@"")]
 18 #endif
 19 
 20 namespace PlotTest
 21 {
 22 
 23   /// <summary>
 24   /// The TestDemo class provides a CLS compliant, MWArray interface to the M-functions
 25   /// contained in the files:
 26   /// <newpara></newpara>
 27   /// D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.m
 28   /// <newpara></newpara>
 29   /// deployprint.m
 30   /// <newpara></newpara>
 31   /// printdlg.m
 32   /// </summary>
 33   /// <remarks>
 34   /// @Version 0.0
 35   /// </remarks>
 36   public class TestDemo : IDisposable
 37   {
 38     #region Constructors
 39 
 40     /// <summary internal= "true">
 41     /// The static constructor instantiates and initializes the MATLAB Compiler Runtime
 42     /// instance.
 43     /// </summary>
 44     static TestDemo()
 45     {
 46       if (MWMCR.MCRAppInitialized)
 47       {
 48         Assembly assembly= Assembly.GetExecutingAssembly();
 49 
 50         string ctfFilePath= assembly.Location;
 51 
 52         int lastDelimiter= ctfFilePath.LastIndexOf(@"\");
 53 
 54         ctfFilePath= ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter));
 55 
 56         string ctfFileName = "PlotTest.ctf";
 57 
 58         Stream embeddedCtfStream = null;
 59 
 60         String[] resourceStrings = assembly.GetManifestResourceNames();
 61 
 62         foreach (String name in resourceStrings)
 63         {
 64           if (name.Contains(ctfFileName))
 65           {
 66             embeddedCtfStream = assembly.GetManifestResourceStream(name);
 67             break;
 68           }
 69         }
 70         mcr= new MWMCR("",
 71                        ctfFilePath, embeddedCtfStream, true);
 72       }
 73       else
 74       {
 75         throw new ApplicationException("MWArray assembly could not be initialized");
 76       }
 77     }
 78 
 79 
 80     /// <summary>
 81     /// Constructs a new instance of the TestDemo class.
 82     /// </summary>
 83     public TestDemo()
 84     {
 85     }
 86 
 87 
 88     #endregion Constructors
 89 
 90     #region Finalize
 91 
 92     /// <summary internal= "true">
 93     /// Class destructor called by the CLR garbage collector.
 94     /// </summary>
 95     ~TestDemo()
 96     {
 97       Dispose(false);
 98     }
 99 
100 
101     /// <summary>
102     /// Frees the native resources associated with this object
103     /// </summary>
104     public void Dispose()
105     {
106       Dispose(true);
107 
108       GC.SuppressFinalize(this);
109     }
110 
111 
112     /// <summary internal= "true">
113     /// Internal dispose function
114     /// </summary>
115     protected virtual void Dispose(bool disposing)
116     {
117       if (!disposed)
118       {
119         disposed= true;
120 
121         if (disposing)
122         {
123           // Free managed resources;
124         }
125 
126         // Free native resources
127       }
128     }
129 
130 
131     #endregion Finalize
132 
133     #region Methods
134 
135     /// <summary>
136     /// Provides a void output, 0-input MWArrayinterface to the PlotTest M-function.
137     /// </summary>
138     /// <remarks>
139     /// M-Documentation:
140     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
141     /// </remarks>
142     ///
143     public void PlotTest()
144     {
145       mcr.EvaluateFunction(0, "PlotTest", new MWArray[]{});
146     }
147 
148 
149     /// <summary>
150     /// Provides a void output, 1-input MWArrayinterface to the PlotTest M-function.
151     /// </summary>
152     /// <remarks>
153     /// M-Documentation:
154     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
155     /// </remarks>
156     /// <param name="n">Input argument #1</param>
157     ///
158     public void PlotTest(MWArray n)
159     {
160       mcr.EvaluateFunction(0, "PlotTest", n);
161     }
162 
163 
164     /// <summary>
165     /// Provides the standard 0-input MWArray interface to the PlotTest M-function.
166     /// </summary>
167     /// <remarks>
168     /// M-Documentation:
169     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
170     /// </remarks>
171     /// <param name="numArgsOut">The number of output arguments to return.</param>
172     /// <returns>An Array of length "numArgsOut" containing the output
173     /// arguments.</returns>
174     ///
175     public MWArray[] PlotTest(int numArgsOut)
176     {
177       return mcr.EvaluateFunction(numArgsOut, "PlotTest", new MWArray[]{});
178     }
179 
180 
181     /// <summary>
182     /// Provides the standard 1-input MWArray interface to the PlotTest M-function.
183     /// </summary>
184     /// <remarks>
185     /// M-Documentation:
186     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
187     /// </remarks>
188     /// <param name="numArgsOut">The number of output arguments to return.</param>
189     /// <param name="n">Input argument #1</param>
190     /// <returns>An Array of length "numArgsOut" containing the output
191     /// arguments.</returns>
192     ///
193     public MWArray[] PlotTest(int numArgsOut, MWArray n)
194     {
195       return mcr.EvaluateFunction(numArgsOut, "PlotTest", n);
196     }
197 
198 
199 
200     /// <summary>
201     /// This method will cause a MATLAB figure window to behave as a modal dialog box.
202     /// The method will not return until all the figure windows associated with this
203     /// component have been closed.
204     /// </summary>
205     /// <remarks>
206     /// An application should only call this method when required to keep the
207     /// MATLAB figure window from disappearing.  Other techniques, such as calling
208     /// Console.ReadLine() from the application should be considered where
209     /// possible.</remarks>
210     ///
211     public void WaitForFiguresToDie()
212     {
213       mcr.WaitForFiguresToDie();
214     }
215 
216 
217 
218     #endregion Methods
219 
220     #region Class Members
221 
222     private static MWMCR mcr= null;
223 
224     private bool disposed= false;
225 
226     #endregion Class Members
227   }
228 }
View Code

TestDemoNative.cs檔案原始碼:

  1 /*
  2 * MATLAB Compiler: 4.17 (R2012a)
  3 * Date: Mon Sep 09 16:19:01 2013
  4 * Arguments: "-B" "macro_default" "-W" "dotnet:PlotTest,TestDemo,0.0,private" "-T"
  5 * "link:lib" "-d" "D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest\src" "-w"
  6 * "enable:specified_file_mismatch" "-w" "enable:repeated_file" "-w"
  7 * "enable:switch_ignored" "-w" "enable:missing_lib_sentinel" "-w" "enable:demo_license"
  8 * "-v" "class{TestDemo:D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.m}" 
  9 */
 10 using System;
 11 using System.Reflection;
 12 using System.IO;
 13 using MathWorks.MATLAB.NET.Arrays;
 14 using MathWorks.MATLAB.NET.Utility;
 15 
 16 #if SHARED
 17 [assembly: System.Reflection.AssemblyKeyFile(@"")]
 18 #endif
 19 
 20 namespace PlotTestNative
 21 {
 22 
 23   /// <summary>
 24   /// The TestDemo class provides a CLS compliant, Object (native) interface to the
 25   /// M-functions contained in the files:
 26   /// <newpara></newpara>
 27   /// D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.m
 28   /// <newpara></newpara>
 29   /// deployprint.m
 30   /// <newpara></newpara>
 31   /// printdlg.m
 32   /// </summary>
 33   /// <remarks>
 34   /// @Version 0.0
 35   /// </remarks>
 36   public class TestDemo : IDisposable
 37   {
 38     #region Constructors
 39 
 40     /// <summary internal= "true">
 41     /// The static constructor instantiates and initializes the MATLAB Compiler Runtime
 42     /// instance.
 43     /// </summary>
 44     static TestDemo()
 45     {
 46       if (MWMCR.MCRAppInitialized)
 47       {
 48         Assembly assembly= Assembly.GetExecutingAssembly();
 49 
 50         string ctfFilePath= assembly.Location;
 51 
 52         int lastDelimiter= ctfFilePath.LastIndexOf(@"\");
 53 
 54         ctfFilePath= ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter));
 55 
 56         string ctfFileName = "PlotTest.ctf";
 57 
 58         Stream embeddedCtfStream = null;
 59 
 60         String[] resourceStrings = assembly.GetManifestResourceNames();
 61 
 62         foreach (String name in resourceStrings)
 63         {
 64           if (name.Contains(ctfFileName))
 65           {
 66             embeddedCtfStream = assembly.GetManifestResourceStream(name);
 67             break;
 68           }
 69         }
 70         mcr= new MWMCR("",
 71                        ctfFilePath, embeddedCtfStream, true);
 72       }
 73       else
 74       {
 75         throw new ApplicationException("MWArray assembly could not be initialized");
 76       }
 77     }
 78 
 79 
 80     /// <summary>
 81     /// Constructs a new instance of the TestDemo class.
 82     /// </summary>
 83     public TestDemo()
 84     {
 85     }
 86 
 87 
 88     #endregion Constructors
 89 
 90     #region Finalize
 91 
 92     /// <summary internal= "true">
 93     /// Class destructor called by the CLR garbage collector.
 94     /// </summary>
 95     ~TestDemo()
 96     {
 97       Dispose(false);
 98     }
 99 
100 
101     /// <summary>
102     /// Frees the native resources associated with this object
103     /// </summary>
104     public void Dispose()
105     {
106       Dispose(true);
107 
108       GC.SuppressFinalize(this);
109     }
110 
111 
112     /// <summary internal= "true">
113     /// Internal dispose function
114     /// </summary>
115     protected virtual void Dispose(bool disposing)
116     {
117       if (!disposed)
118       {
119         disposed= true;
120 
121         if (disposing)
122         {
123           // Free managed resources;
124         }
125 
126         // Free native resources
127       }
128     }
129 
130 
131     #endregion Finalize
132 
133     #region Methods
134 
135     /// <summary>
136     /// Provides a void output, 0-input Objectinterface to the PlotTest M-function.
137     /// </summary>
138     /// <remarks>
139     /// M-Documentation:
140     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
141     /// </remarks>
142     ///
143     public void PlotTest()
144     {
145       mcr.EvaluateFunction(0, "PlotTest", new Object[]{});
146     }
147 
148 
149     /// <summary>
150     /// Provides a void output, 1-input Objectinterface to the PlotTest M-function.
151     /// </summary>
152     /// <remarks>
153     /// M-Documentation:
154     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
155     /// </remarks>
156     /// <param name="n">Input argument #1</param>
157     ///
158     public void PlotTest(Object n)
159     {
160       mcr.EvaluateFunction(0, "PlotTest", n);
161     }
162 
163 
164     /// <summary>
165     /// Provides the standard 0-input Object interface to the PlotTest M-function.
166     /// </summary>
167     /// <remarks>
168     /// M-Documentation:
169     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
170     /// </remarks>
171     /// <param name="numArgsOut">The number of output arguments to return.</param>
172     /// <returns>An Array of length "numArgsOut" containing the output
173     /// arguments.</returns>
174     ///
175     public Object[] PlotTest(int numArgsOut)
176     {
177       return mcr.EvaluateFunction(numArgsOut, "PlotTest", new Object[]{});
178     }
179 
180 
181     /// <summary>
182     /// Provides the standard 1-input Object interface to the PlotTest M-function.
183     /// </summary>
184     /// <remarks>
185     /// M-Documentation:
186     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
187     /// </remarks>
188     /// <param name="numArgsOut">The number of output arguments to return.</param>
189     /// <param name="n">Input argument #1</param>
190     /// <returns>An Array of length "numArgsOut" containing the output
191     /// arguments.</returns>
192     ///
193     public Object[] PlotTest(int numArgsOut, Object n)
194     {
195       return mcr.EvaluateFunction(numArgsOut, "PlotTest", n);
196     }
197 
198 
199     /// <summary>
200     /// Provides an interface for the PlotTest function in which the input and output
201     /// arguments are specified as an array of Objects.
202     /// </summary>
203     /// <remarks>
204     /// This method will allocate and return by reference the output argument
205     /// array.<newpara></newpara>
206     /// M-Documentation:
207     /// 編寫一個簡單的函式,對plot進行簡單封裝一下
208     /// </remarks>
209     /// <param name="numArgsOut">The number of output arguments to return</param>
210     /// <param name= "argsOut">Array of Object output arguments</param>
211     /// <param name= "argsIn">
            
           

相關推薦

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

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

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

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

原創開源.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許可權。折騰人,看到很多人在群裡面使用這個東西,出現各種抓