1

可変引数を取る関数があります。これらの引数はパラメーターと値のペアでvararginあり、奇数インデックスの要素がすべて文字列 (パラメーター) であるセル配列も同様ですが、偶数インデックスの要素は文字列、数値、または文字列のセル配列にすることができます。で特定の文字列のインデックスを検索したいvarargin。有効なソリューションがありますが、arrayfun2 回使用します。そのようなセル配列で文字列を見つけるための、よりクリーン/高速/より効果的な方法はありますか? 結果indexは、その要素と次の要素を から削除するために使用されvararginます。新しい変数の作成を最小限に抑えたいと思います。

str_to_find = 'paramX'
finds = arrayfun(@(i) strfind(varargin{i},str_to_find), 1:length(varargin), 'UniformOutput', 0);
finds2 = arrayfun(@(i) ~iscell(finds{i}) && ~isempty(finds{i}), 1:length(finds));
index = find(finds2==1);

varargin(index)=[];
varargin(index)=[];

与えられたvararginis {'paramA', 'valueA', 'paramB', 9, 'paramX', {'z','x','c'}、次にfindsis [] [] [] [] [1] {1x3 cell}finds2is 0 0 0 0 1 0、およびindexis5です。したがって、私のソリューションは必要なことを行いますが、見苦しく見えます。その要素を から削除するfinds2には (つまり、 create ではなく)使用するだけですが、その後の要素も削除する必要があります。indexvarargin

4

2 に答える 2

3

strcmpかなり高速な組み込み関数を使用できます。

idx  = strcmp(str_to_find, varargin);

これにより、ターゲットに一致する文字列であるすべてのセル要素へのインデックスが得られます。

次に、これらの要素を剪定するために、使用できます

varargin( or(idx, [0 idx(1:end-1)]) ) = [];

idx が行配列であると仮定します。

最後に、いくつかの形式チェックを実行して、ユーザーが間違った順序で (またはパラメーター名と一致する引数名を使用して) 引数のペアを入力していないことを確認することもできます。そうしないと、この種のコードは奇妙な動作をします。

于 2012-08-14T18:18:31.090 に答える