2017-10-28 4 views
6

Matlabでは、eval関数を使用して任意の文字列をコードとして評価できます。例えば。Matlab repr function

s = '{1, 2, ''hello''}' % char 
c = eval(s)    % cell 

逆の操作を行う方法はありますか。任意の変数のリテラル文字列表現を取得しますか?つまり、scから復元しますか?

s = repr(c) 

このようなrepr機能のような 何かは、Pythonに組み込まれていますが、私はMatlabのでは、それのようなものに遭遇していませんでした、また私はそれを自分で実装する方法の明確な方法を参照しています。

私が知る最も近いことは、disp(c)のようなものですが、cの表現をプリントアウトしますが、リテラルコードフォーマットではなく「読み取り可能」フォーマットです。

+0

私はこのように、おそらく他の方法でmatlabでそうすることはできないと思います。マントラ*の機能は第一級市民*のため、あなたはPythonでそれを行うことができます。これはmatlabの場合ではありません。 – percusse

+0

なぜそれが制限要因ですか? –

+0

これで、関数を引数として別の関数にプラグインすることはできません。例えば、関数ハンドルを 'functions()'関数を使って行うことができます。 – percusse

答えて

2

はそれのためのドキュメントです。

希望に役立ちます!

+0

**非常に**クールです。しかし、2つの不満があります。結果として得られる '.m'ファイルは、1行リテラルとして書き出すのではなく、複雑なデータ構造を構築します。結果はファイルに保存する必要がありますが、結果は文字列として使用します。それはさておき、これまでのところ最高の答えです。 –

3

わかりました、あなたの痛みがあります。

私のアドバイスは、まだfprintfsprint、友人にtoStringレバレッジの種類の機能を提供するだろうが、私はあなたのデータの種類がわからない場合、それは退屈であり得ることを理解し、また、いくつかのサブケースが必要です。

あなたが言及したdisp機能を使用してevalcを使用することができます。

このような何かが動作するはず

function out = repr(x) 
    out = evalc('disp(x)'); 
end 

それとも簡潔

repr = @(x) evalc('disp(x)'); 
+0

確かに 'evalc'は解決策の一つです。そして、はい、それは[toString](https://se.mathworks.com/matlabcentral/fileexchange/38566-string-representation-of-any-data-type)の行に沿って何かを一緒にハックすることができるようですが、これはかなりの作業が必要になります。 –

+0

@jmd_dk、yup:私は 'toString'の方法のアドバイスをします。おそらく私はあなたのデータの基礎となるクラスを特定し、サイズを決めてサイズに応じて文字列を作成します。 iscell、ischarなどを使用することもできます。もう一つの方法は、OOPの方法で、あなたの 'toString'メソッドを定義するクラスの周りにデータをラップすることです。例えば'PrintableData'クラスを定義し、継承を通じて 'PrintableCell'、 'PrintableArray'などを実装します。 –

6

最も近いMATLABであり、ベクトルを含む数値、文字または論理的な2次元配列(のために働くmat2str、あります)。 (ND配列、セル配列、構造体配列、またはテーブルでは機能しません)。

例:

  • 私が任意にネストされたセル、数値、文字または論理配列で2Dセルアレイの文字列表現を取得するために書いた機能を:あなたが見ることができる。このrelated question and answers

    >> a = [1 2; 3 4]; ar = mat2str(a), isequal(eval(ar), a) 
    ar = 
        '[1 2;3 4]' 
    ans = 
        logical 
        1 
    
    >> a = ['abc'; 'def']; ar = mat2str(a), isequal(eval(ar), a) 
    ar = 
        '['abc';'def']' 
    ans = 
        logical 
        1 
    

  • Octaveで任意のデータ型を使用する方法。あなたはこれをしたい理由を正確に応じて、ご利用の場合はmatlab.io.saveVariablesToScript

    Hereで解決することができる