2012-10-09 3 views
7

私はそうのような、エラーメッセージに使用するMatlabの中で機能を探しています:データ構造体を文字列に変換するMatlab関数はありますか?

error(['Invalid value for someVariable: ' wantedFunction(someVariable)]); 

私はwantedFunctionは、文字列、配列、セル配列、理想的にも構造体配列の両方を取ることができるようにしたいです。

今のところ私はnum2strを使用していますが、これはセルでは機能しません。私はsprintfでやってみたいと思っていたが、どうやって考えているのか分からなかった。私は自分自身の関数を書くことができると思いますが、既にMatlabでこれを行う方法があれば冗長になります。何か案は?

+1

最新の編集(toString.m)を見てください。これは、承認されたファイル交換に配置されるバージョンです。 –

答えて

14

はい、それは簡単ではありませんが、

toString = @(var) evalc(['disp(var)']); 

だから、あなた例えば:

>> var = {rand(3,1), 'A', struct('test', 5)}; 
>> error(['Invalid value for var: ' toString(var)]) 

??? Invalid value for var:  [3x1 double] 'A' [1x1 struct] 
+0

ありがとう!これは私が探していたものです:それを行う最も簡単な方法です。 homebrewのtoString関数(それを1行または完全な関数にする)を避けるために、私は次のようにします: 'disp(someVariable);エラー( '...はsomeVariableに無効な値です); – Nagel

+0

他の回答で関数を使用してしまいました。 – Nagel

+1

これはネスト構造をプリントしません。 – Dims

2

いいえ、このような機能はありません。私は同様の問題に遭遇したので、ここで私が使用する非常に初歩的な機能です。完了していないことを認識してください。例えば、構造体のフィールドを意味のある方法で出力するのではなく、簡単に追加することができます。基本的な実装として扱い、ニーズに合わせることができます。

function ret = all2str(param) 
if isempty(param) 
    if iscell(param) 
     ret = '(empty cell)'; 
    elseif isstruct(param); 
     ret = '(empty struct)'; 
    else 
     ret = '(empty)'; 
    end 
    return; 
end 

if ischar(param) 
    ret = param; 
    return; 
end 

if isnumeric(param) 
    ret = num2str(param); 
    return; 
end 

if iscell(param) 
    ret = all2str(param{1}); 
    for i=2:numel(param) 
     ret = [ret ', ' all2str(param{i})]; 
    end 
    return; 
end 

if isstruct(param) 
    ret = '(structure)'; 
    return; 
end 
end 
+0

Hmmm ...私は 'mall2str'を持っていないようです...それはR2012の問題ですか? Plus:なぜ 'fieldnames'などを使って構造体を出力しないのですか?そして、空に '' [] ''や '' {} ''を書かないのはなぜですか? –

+0

@RodyOldenhuis社内での使用のために書いたので、あなたは持っていません。決して完璧ではありません。私が答えて言ったように、私は構造を扱っていません。なぜなら、私はその特定の機能を必要としなかったからです;しかし、確かに、それは簡単に実装できます。私が印刷したものは、私のために便利でした。 – angainor

+0

@RodyOldenhuis ow、そこにタイプミスがありました。私は 'mall2str'を' all2str'に改名しましたが、どこにでもありません....ありがとう – angainor

2

をいえば

string = evalc(['disp(someVariable)']) 

あなたはより管理しやすい形にこれをキャストすることができます:あなたはevalcと組み合わせてdispを使用する必要があります私は長いこと、アンゲナーが彼の答えでしたこととかなり似ています。任意のものを文字列に変換することに興味があり、その変換がどのように行われるかを一般的により詳細に制御するために、ここに投稿します。

空、論理、文字、関数ハンドル、数値、セル、構造体(配列)、ユーザー定義クラス(次の更新では疎配列)をサポートしています。

編集:私はfile exchangeに配置された更新のテンプレートとしてこれを使用しました。自由に実験し、必要に応じて変更してください。

+1

+1彼らはちょっと前にプッシュしたようですが、スタートの直後にあきらめたのと同じように始まります;) – angainor

+0

素晴らしい!私はこれが適切にそれをしたいと思うなら使用する関数だと思います。 – Nagel

+0

クール!私は喜んでそれを使用します。あなたはそれについてかなりの仕事をしました...今、そのような機能が最終的に存在します:) – angainor

0

は奇妙に見えますが、

str = matlab.unittest.diagnostics.ConstraintDiagnostic.getDisplayableString(value) 

は、代わりにそのevalc(disp())アプローチを使用して、あなたのために仕事をしていません。