7

次のようなエラーメッセージに使用するMatlabの関数を探しています。

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

wantedFunction文字列、配列、セル配列、理想的には構造体配列の両方を取得できるようにしたいと考えています。

今のところ、私はを使用しnum2strていますが、それはセルでは機能しません。やりたいことができると思っていたのですが、どうしたらいいsprintfのかわかりませんでした。独自の関数を作成できると思いますが、Matlabでこれを行う方法がすでにある場合は、冗長になります。何か案は?

4

4 に答える 4

14

はい、簡単ではありませんが。dispと組み合わせて使用​​する必要がありますevalc

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

これをより管理しやすい形式にキャストできます。

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]
于 2012-10-09T12:29:43.433 に答える
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
于 2012-10-09T11:51:12.323 に答える
2

そういえば、昔、アゲイナーが答えたのとよく似たようなことをしたのを覚えています。任意のものを文字列に変換することに興味があり、一般的にその変換がどのように行われるかをより細かく制御できる人のために、ここに投稿します。

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

編集:私はこれを、ファイル交換に配置することになった更新のテンプレートとして使用しました。自由に試して、ニーズに合わせて変更してください。

于 2012-10-09T14:55:49.307 に答える
2

奇妙に見えますが、

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

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

于 2017-10-31T08:15:43.237 に答える