簡體   English   中英

Matlab調用的Mex函數和數值差異

[英]Mex function called from Matlab and numerical difference

我有一個Matlab科學代碼,我想精確地比較包含調用反函數pinv()(本機Matlab)的Matlab代碼的輸出與現在調用pinv()的C ++實現的相同Matlab代碼的輸出。

我使用Matlab代碼來調用C ++ pinv而不是Matlab pinv():我使用相關的API將C ++ pinv編譯為mex文件。

在Matlab和C ++ pinv()之間的實現差異之上,對編譯為mex文件的函數的調用能否引入一些數值差異?

由MATLAB執行的所有矩陣運算均由LAPACK庫實現,是的,實現可能會引起差異。 如果您要問的是“ LAPACK庫使用的硬件浮點功能是否不同於C ++編譯的代碼” ,那是極不可能的-除非指示C ++編譯器生成針對特定硬件平台的代碼,該平台將可用的硬件子集化為子集。

但是,即使代碼在源代碼級別上相似,LAPACK還是從FORTRAN源代碼編譯而來,而自定義例程是C ++生成的; 不同編譯器所做的優化是不同的。 因此,即使使用非常相似的源代碼 ,最終產生的可執行代碼也很有可能會有所不同。 這可能導致不同的結果。

注意:數據的操作(即,傳遞給函數的方式)不會改變數據的內容; 這可能是執行時間的問題,而不是數字偏差。 MEX基本上是關於如何將本機MATLAB數據結構呈現給任何例程的約定。 例程訪問數據的效率還是實現的問題。

進一步的評論:必須說2D數據的FORTRAN內存中布局是列第一,而2D數據的C和家庭系列內存中布局是行第一(我說的是索引)。 由於現代硬件架構的性能高度依賴於(例如,發生了多少次高速緩存未命中),因此,這還可能導致執行時間有所不同(與執行代碼一樣),具體取決於實現算法如何訪問數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM