4

まあ、私はmlabwrapが正しくインストールされたことを誇りに思っていましたが、今ではmatlabセルで動作させることができません。Pythonでは、リストはセルに類似しているため、リストを入力すると、mlabwrapがそれをセルに変換すると考えました。残念ながら、それはそのようには機能しないようです。

たとえば、matlabのmファイルがあります。

function list_test(x)
display(x);

Pythonでは、次のように入力すると

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

私は得る:

x =

1     2
3     4

したがって、mlabwrapは私の2つのネストされたリストを取得し、それらを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

明らかにサイコロはありません。

必要に応じて、リストをいくつかの1-D配列に変換するPythonコードを記述し、mlabwrapを使用して1-D配列をmatlabにフィードし、それらの1-D配列をセルに変換するmatlabコードを記述できると思います。しかし、これは面倒なので、もっと簡単な方法があるかどうか知りたいです。mlabwrapはどういうわけか私のためにこれを行うことができますか?

これが私のセットアップの詳細です。OS:Mountain Lion(OS X 10.8)、Python:2.7、Matlab:2010b、mlabwrap:1.1

4

2 に答える 2

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配列を必要とするためです。

簡単に比較するために、matlabに切り替えてみましょう。

>> display(cell)

cell = 

    [1x2 double]    [1x2 double]

いいね!ただし、Pythonに切り替えて、作成したセル配列に実際にアクセスしてみると、次のようになります。

>>> 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オブジェクトに格納されているデータへのアクセスを実際には許可していません。これを回避する方法はいくつかあります。matlabcell_insert で関数を記述できます。cell_popこれらにより、Python変数を既存のセル配列に配置し、Pythonで読み取り可能な変数をセル配列から取得できるようになります。または、セル配列をmatlabから.matファイルに書き込み、を使用してPythonに読み込むこともできます。scipy.io.loadmat()

正直なところ、何らかの理由でセル配列が絶対に必要でない限り、mlabwrapを介してそれらを使用することは避けようとします。

于 2013-05-30T17:31:42.967 に答える
0

誰かがこの数年後に読んだ場合、実際にはセル配列と文字配列の基本的なサポートがあります。これを入力するだけです。

mlab._dont_proxy["cell"] = True

セルまたはchar配列を返すmatlabコマンドを使用する前。これはhttps://github.com/aweinstein/mlabwraphttps://github.com/cpbotha/mlabwrap-purepyでテストされました

于 2019-11-21T18:58:32.947 に答える