2013-07-31 56 views
1

我使用的mxCreateNumericMatrix功能:我MEX文件確定mwSize的mxClassID在MEX文件

mxArray *mxCreateNumericMatrix(mwSize m, mwSize n, mxClassID classid, mxComplexity ComplexFlag); 

我想型mwSize的陣列。 爲此我需要確定是否使用mxUINT32_CLASSmxUINT64_CLASS as classid

我可以在運行時使用if語句在sizeof(mwSize)上確定它,但有沒有更優雅的方法來確定mwSize的類ID?也許有些定義取決於具有一種價值或另一種價值的體系?

只是一個美學問題。

順便說一句,在Fortran的有一個功能mxClassIDFromClassName: http://www.mathworks.com/help/matlab/apiref/mxclassidfromclassname.html

mwSize用於除其它原因外,使得mxCreateDoubleMatrix功能將是便攜式的。如果沒有優雅的解決方案存在mxCreateNumericMatrix,這很奇怪。

編輯:

如@Praetorian解釋的,在我的情況下,我沒有理由使用適合的系統(32或64位),因爲我喜歡專門它是64位整數數組的類型,我也可以在32位系統中定義這個大小。

但另一方面,我也想返回兩個索引到我返回的數組。就我而言,我知道陣列本身很短,我總是使用uint16_T,但如果我想要它適合mwIndex,我將不得不使用一些宏(@Amro提出了一些很好的選擇),因爲顯然,沒有整數(適合系統)的mxCreateDoubleMatrix功能。

總結起來,@Praetorian在下面的評論中幫助了我的案子,@Amro給出了一般情況下可用的最佳選擇。

+0

是否使用C或C++? – Praetorian

+0

@Praetorian我正在使用** C ** – ip84

+0

在這種情況下,您在編譯時確定32/64位的最佳選擇是使用宏。也許'#if SIZE_MAX == UINT64_MAX'將起作用 – Praetorian

回答

0

您是否在C中嘗試過mxClassIDFromClassName?根據this list的無證libmx函數discussed here,似乎存在。但是,是的,如果您想堅持在線文檔中列出的內容,除了使用if聲明之外,我不知道其他方法。在mex中創建除雙矩陣之外的東西總是更加混亂。

3

mxCreateNumericMatrix和其他mxCreate*功能的目標是創建一個mxArray(MATLAB基本類型)。這些數組可以從MEX函數返回到MATLAB。

mwSize只是一個typedefsize_t類型(可能是32位與64位的不同),這不是有效的數據類型MATLAB(未的mxClassID一部分)。如果實際上你想創建一個mwSize的數組,在C中按照通常的方式mxMalloc分配內存(但是我懷疑這是你在這種情況下想要的)。


作爲禁筆記,實際的C類型mwSizemwIndex被Typedef的是通過將傳遞給mex命令標誌來確定(或默認值,如果你沒有明確指定一個):

>> mex -largeArrayDims file.c 
>> mex -compatibleArrayDims file.c 

如果我們考察其被列入tmwtypes.h頭文件,這裏是代碼相關的功能塊:

#ifdef MX_COMPAT_32 
typedef int mwSize; 
typedef int mwIndex; 
typedef int mwSignedIndex; 
#else 
typedef size_t mwSize;   /* unsigned pointer-width integer */ 
typedef size_t mwIndex;  /* unsigned pointer-width integer */ 
typedef ptrdiff_t mwSignedIndex; /* a signed pointer-width integer */ 
#endif 

(回想一下,size_t本身是平臺相關的)。


正如在上面的評論中提到的,我認爲你錯誤地解釋了文檔。 mwIndexmwSize用於索引到矩陣中時以及在寫入MEX函數時分別處理矩陣大小(而不是使用非便攜式純色int)時使用。他們沒有對應的mxClassID(所以你不能創建這些類型的mxArray,並將它們傳遞迴MATLAB)。

現在,如果你想創建一個索引數組並將其返回給MATLAB用作常規變量,你可以創建一個等效類型爲mxArray的無符號整數(匹配你的體系結構的bit-ness:32位與64位)。使用macros來確定您正在編譯哪一個,並相應地使用mxUINT32_CLASSmxUINT64_CLASS

例如,我們可以使用相同的宏MATLAB使用:

#ifdef MX_COMPAT_32 
typedef mxUINT32_CLASS INDICES_CLASS; 
#else 
typedef mxUINT64_CLASS INDICES_CLASS; 
#endif 

mxArray *arr = mxCreateNumericMatrix(10, 1, INDICES_CLASS, mxReal); 
// ... fill arr with indices 
+0

如果'-largeArrayDims'開關沒有傳遞給mex函數(我相信這個開關是默認設置的),'mwSize'也可以是'int' – Praetorian

+0

我創建了矩陣以便將它作爲輸出參數返回mex功能。我使用了mwSize,因爲它在關於mex文件的文檔中解釋過,如果你想讓你的代碼是可移植的(他們也提到了mwIndex),就可以這樣做。 這是我第一次使用mex文件,而且我對Matlab很新,所以我遵循了這些建議。 我不知道我是否可以使用mxMalloc返回矩陣,但是我發現我仍然必須確定它是32位還是64位。 – ip84

+0

@ ip84:看我的編輯,現在應該有點清楚 – Amro