2013-03-24 106 views
3

嗯,我爲自己感到驕傲,我正確地安裝了mlabwrap,但是現在我無法使它與matlab單元一起工作。在Python中,列表類似於單元格,所以我想我會輸入一個列表,mlabwrap會將它轉換爲單元格。不幸的是,它似乎並沒有這樣工作。如何使用mlabwrap從python調用帶有單元參數的matlab函數?

例如,我有一個matlab m文件:

function list_test(x) 
display(x); 

在蟒蛇,如果我鍵入

mlab.list_test([[1,2],[3,4]]) 

我得到:

x = 

1  2 
3  4 

因此,mlabwrap似乎拿我的兩個嵌套列表,把它們變成一個2x2矩陣,這不是我想要的。

當我嘗試

mlab.list_test([[1,2],[3,4,5]]) 

然後我得到:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/Ben/.virtualenvs/test/lib/python2.7/site-packages/mlabwrap.py", line 607, in mlab_command 
    return self._do(name, *args, **update({'nout':nout}, kwargs)) 
    File "/Users/Ben/.virtualenvs/test/lib/python2.7/site-packages/mlabwrap.py", line 534, in _do 
    mlabraw.put(self._session, argnames[-1], arg) 
TypeError: a float is required 

顯然沒有骰子。

如果必須,我想我可以編寫一些python代碼將列表轉換爲多個1-D數組,使用mlabwrap將1-D數組提供給matlab,並編寫一些matlab代碼將這些1-D數組轉換爲細胞。但是這很混亂,我想知道是否有更簡單的方法。 mlabwrap能以某種方式爲我做這件事嗎?

以下是我的設置的詳細信息。 OS:山獅子(OS X 10.8), 的Python:2.7, Matlab的:2010年b, mlabwrap:對於單元陣列1.1

+0

有沒有人遇到過同樣的事情?任何想法如何解決它?似乎有一些mlabwrap中的機器用於將matlab中的單元格讀入python,但我不確定是否支持從python讀取列表(單元格)到matlab中。 – Stretch 2013-03-27 02:27:23

回答

1

不幸的是,mlabwrap具有有限的支持;將細胞陣列傳遞到matlab時,以及從matlab接收細胞陣列時。

這裏是你的直接問題的答案:

>>> from mlabwrap import mlab as matlab 

>>> a = [[1, 2], [3, 4]] 
>>> cell = matlab.mat2cell(array(a), [1, 1], [2]) 
>>> matlab.display(cell) 

PROXY_VAL2__ = 

    [1x2 double] 
    [1x2 double] 

注意,這真的只有定期大小列出的作品。即[[1,2],[3,4]]起作用,但[[1,2],[3,4,5]]不起作用。這是因爲mlabwrap不能很好地處理dtype = object數組,而是需要dtype = float數組。

讓我們SWICH到MATLAB進行快速比較:

>> display(cell) 

cell = 

    [1x2 double] [1x2 double] 

看起來不錯!然而,當我們切換回蟒蛇,並嘗試實際訪問,我們已經創造了單元陣列:

>>> cell[0][0] 

error: Unable to get matrix from MATLAB(TM) workspace 

>>> cell[0, 0] 

error: Unsupported index type: <type 'tuple'> 

>>> type(cell) 
mlabwrap.MlabObjectProxy 

不幸的是,mlabwrap並沒有真正允許訪問存儲在MlabObjectProxy對象中的數據。有幾種方法可以嘗試解決這個問題。您可以在matlab中編寫cell_insertcell_pop函數。這些應該使您能夠將python變量放入現有的單元格數組中,並從單元格數組中獲取python可讀的變量。或者,您可以將單元格數組寫入一個。mat文件,並將其讀入python使用scipy.io.loadmat()

老實說,除非你絕對需要單元陣列出於某種原因,我會盡量避免通過mlabwrap使用它們。

+0

好的。謝謝,布倫特,考慮到這一點。對於我的應用程序,使用單元格的重點是使用不規則長度的列表。在意識到單元和結構不能工作(很容易)之後,我決定只是咬緊牙關,將我的matlab代碼轉換爲python。 – Stretch 2013-05-31 00:45:23

+0

沒問題。我很抱歉需要的端口。如果你覺得答案足夠解決你的問題,你會接受嗎? – brentlance 2013-05-31 16:11:23

+0

我接受了你的回答。謝謝。 – Stretch 2013-06-01 01:49:50