9

次のような構造体を持つ要素のリスト (セル配列) があります。

mystruct = struct('x', 'foo', 'y', 'bar', 's', struct('text', 'Pickabo'));
mylist = {mystruct <more similar struct elements here>};

ここで、s.text == 'Pickaboo' またはその他の事前定義された文字列からのすべての構造体の mylist をフィルター処理したいと思います。MATLAB でこれを達成するための最良の方法は何ですか? 明らかにこれは配列にとっては簡単ですが、セルに対してこれを行う最良の方法は何ですか?

4

3 に答える 3

12

これにはCELLFUNを使用できます。

hits = cellfun(@(x)strcmp(x.s.text,'Pickabo'),mylist);
filteredList = mylist(hits);

しかし、なぜ構造体のセルを作成するのですか?構造体がすべて同じフィールドを持っている場合は、構造体の配列を作成できます。ヒットを取得するには、ARRAYFUNを使用します。

于 2010-08-11T19:40:45.140 に答える
4

cell 配列内のすべての構造体に同じフィールド ( 'x''y'、および) がある場合は、cell 配列ではなく構造体配列として's'保存できます。次のようにmylist変換できます。mylist

mylist = [mylist{:}];

ここで、すべてのフィールド's'に同じフィールドを持つ構造体も含まれている場合、同じ方法でそれらをすべてまとめて収集し、STRCMP'text'を使用してフィールドを確認できます。

s = [mylist.s];
isMatch = strcmp({s.text},'Pickabo');

ここでは、一致が見つかった場合と同じ長さisMatch論理インデックス ベクトルmylistになり、それ以外の場合はゼロになります。

于 2010-08-11T20:07:11.150 に答える
2

を使用しcellfunます。

mystruct = struct('x', 'foo', 'y', 'bar', 's', struct('text', 'Pickabo'));
mystruct1 = struct('x', 'foo1', 'y', 'bar1', 's', struct('text', 'Pickabo'));
mystruct2 = struct('x', 'foo2', 'y', 'bar2', 's', struct('text', 'Pickabo1'));

mylist = {mystruct, mystruct1, mystruct2 };

string_of_interest = 'Pickabo'; %# define your string of interest here
mylist_index_of_interest = cellfun(@(x) strcmp(x.s.text,string_of_interest), mylist ); %# find the indices of the struct of interest
mylist_of_interest = mylist( mylist_index_of_interest ); %# create a new list containing only the the structs of interest
于 2010-08-11T19:45:35.703 に答える