7

allDataNx1のセル配列があります。各セルには、namesプロパティを持つ構造が含まれています(名前はカスタムオブジェクトですが、必要に応じて文字列のセル配列と考えてください)。すべての名前を含む単一のセル配列を作成したいと思います。たとえば、N = 3の場合、つまりallData3x1セル配列の場合、次のようにして私の目標を達成できます。

A = allData{1};
B = allData{2};
C = allData{3};

allNames = [A.names B.names C.names];

このアプローチの問題は、Nが大きく、入力に応じて変化することです。そのため、を使用してこれを行うための賢い方法があることを期待してcellfunいますが、私が試したすべてが失敗します(たとえば、うまくいきません)。allNames = [cellfun(@(x) {x.names}, allData)];)。

更新:提案された解決策のおかげで、すべてを1つのセル配列にまとめることができます。各セルにはセル配列が含まれています。ここでの私の目標は、これらを連結することです。多かれ少なかれ、私が持っているのは:

{A.names B.names C.names} 

そして、私が欲しいものと得られないように見えるものは

{A.names{1} A.names{2} ... A.names{end} B.names{1} ... B.names{end} ...}

解決策:以下の各回答の一部が必要だったので、これが私のために働いた解決策です:

アンドリュー・ラザロから:

allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);

次に、gnoviceから:

allNames = vertcat(allNames{:});

両方に感謝します!!

4

2 に答える 2

4

より一般的なソリューションに必要なセルの内容について、さらにいくつかの詳細がありますが、namesプロパティが常に文字列のセル配列を返し、構造体がすべてスカラー (つまり、1 行 1 列の構造体配列) である場合は、CELLFUNCHAR、およびCELLSTRを使用した次のソリューションallNamesでは、すべての名前を含む文字列の N 行 1 列のセル配列が得られます。

allNames = cellfun(@(x) {char(x.names)},allData);
allNames = cellstr(char(allNames{:}));

allDataそして、 3 つの異なる構造を含む例を次に示します。

>> allData{1} = struct('names',{{'hello'}},'junk',1:3);
>> allData{2} = struct('names',{{'hi' 'yo' 'hey' 'whassup'}});
>> allData{3} = struct('names',{{'howdy';'aloha'}},'junk',4);
>> allNames = cellfun(@(x) {char(x.names)},allData);
>> allNames = cellstr(char(allNames{:}))

allNames = 

    'hello'
    'hi'
    'yo'
    'hey'
    'whassup'
    'howdy'
    'aloha'

編集:

プロパティが必ずしも文字列ではなくオブジェクトnamesのセル配列を返す場合に一般化すると、各セル配列を M 行 1 列のセル配列に再形成し、それらすべてを N 行1 列のセル配列に垂直方向に連結するこのソリューションを試すことができます。オブジェクトの 1 つの cell 配列:

allNames = cellfun(@(x) {reshape(x.names,[],1)},allData);
allNames = vertcat(allNames{:});

または、オブジェクトの 1 行 N 列の cell 配列になりたい場合は、次のようにすることができます。

allNames = cellfun(@(x) {reshape(x.names,1,[])},allData);
allNames = [allNames{:}];
于 2011-05-17T05:10:12.340 に答える
1

これを試して

 allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false)

直接連結の UniformOutput vararg を省略します。これにより、セル出力が得られます。

于 2011-05-17T00:04:35.647 に答える