3

多くの場合、私の関数には、有効なオプションの数が少ない文字列引数が含まれています。たとえば、の最後の引数に似たモードを表す場合がありますinterp1。ユーザーが間違った値を渡した場合、エラーメッセージに有効なオプションのリストを表示したいと思います。

現在、私はそれを次のように解決します:

function out = my_func(mode)
valid_modes = {'rectangular', 'gaussian'};
switch mode
    case 'rectangular'
        % do something
    case 'gaussian'
        % do something else
    otherwise
        error(['atmlab:' mfilename ':invalid'], 'Invalid mode: %s. Valid modes: %s', mode, sprintf('%s ', valid_modes))
end

私が利用しているトリックはsprintf、セル配列を取得して、複数の文字列の連結を出力できることです。ただし、この動作は文書化されていないようであり、Matlab 2012bの時点で、MatlabsCodeAnalyzerはこの使用法に対して警告を発し始めていますsprintf。それでも機能しますが、サポートされている方法ではない可能性があり、今後も機能するかどうかわからないため、警告を単に無視または抑制することには消極的です。

別の解決策はを使用することevalc('disp(valid_modes)')ですが、その解決策は私を吐き気にさせます。

文字列のセル配列の値を便利かつエレガントに表示するにはどうすればよいですか?

4

4 に答える 4

6

sprintfリストを使用して、この方法を使用できます

sprintf('%s ', valid_modes{:})

それはうまくいきます。私はあなたがそれをあなたがしたように書くことができることに実際に驚いています。エラーが発生します。

今より複雑なルートに行く:)あなたはいつでもこれを行うことができます

str = [valid_modes{:}]; % that is a string

モード名の中にスペースを含める必要がありますが、これはおそらくやりたくないでしょう。ただし、2行目にスペースを含めるように宣言することはできます。

valid_modes = {'rectangular'    'gaussian'
               ' '              ' '} 
str = [valid_modes{:}]
ans =

 rectangular gaussian 
于 2012-10-03T17:14:26.840 に答える
3

cellfunこれは、とを使用したワンライナーソリューションcell2matです。MATLABR2012aで​​テスト済み。

error(['atmlab:' mfilename ':invalid'], 'Invalid mode: %s. Valid modes: %s\n', mode, cell2mat(cellfun(@(x) [ x ' ' ], valid_modes, 'UniformOutput', false)));
于 2012-10-03T18:37:30.877 に答える
1

セル配列を文字列に変換する関数を作成できます。

 function st = cell2str(cellStr)
     cellStr= cellfun(@(x){[x ',']},cellStr); %# Add ',' after each string.
     st = cat(2,cellStr{:});  %# Convert to string             
     st(end) = []; %# Remove last ','
 end

セル配列のみを表示し、文字列として渡さない場合は、celldisp関数を使用できます。

于 2012-10-03T16:37:02.303 に答える
1

Matlabの最近のバージョン(2013b以降だと思います)以降strjoin、セル配列内の文字列を結合する新しい関数があります。例えば:

C = {'Newton','Gauss','Euclid','Lagrange'};  
str = strjoin(C,', ')
于 2015-03-26T15:22:47.567 に答える