3

IDarrayfunを使用してクラスのオブジェクトの配列を作成する必要があります。

% ID.m
classdef ID < handle
    properties
        id
    end
    methods
        function obj = ID(id)
            obj.id = id;
        end
    end
end

しかし、エラーが発生します:

>> ids = 1:5;
>> s = arrayfun(@(id) ID(id), ids) 
??? Error using ==> arrayfun
ID output type is not currently implemented.

代わりにループで構築することもできます。

s = [];
for k = 1 : length(ids)
    s = cat(1, s, ID(ids(k)));
end

しかし、arrayfunのこの使用法の何が問題になっていますか?

編集(質問の明確化):問題は、問題を回避する方法ではなく(いくつかの解決策があります)、単純な構文s = arrayfun(@(id) ID(id), ids);が機能しない理由です。ありがとう。

4

3 に答える 3

5

おそらく最も簡単なのは、cellfunを使用するか、'UniformOutput'オプションを設定してarrayfunにセル配列を返すように強制することです。次に、このセル配列をオブジェクトの配列に変換できます(上記のcatを使用するのと同じです)。

s = arrayfun(@(x) ID(x), ids, 'UniformOutput', false);
s = [s{:}];
于 2012-06-05T13:24:56.863 に答える
3

あなたはarrayfunそれがするように構築されていない何かをするように求めています。

からの出力は次のようにするarrayfun必要があります

スカラー値(数値、論理、文字、または構造)またはセル配列。

オブジェクトはスカラータイプのいずれとしてもカウントされません。そのため、「回避策」はすべて、出力としてセル配列を使用する必要があります。試してみる1つのことはcell2mat、出力を目的の形式に変換するために使用することです。1行で実行できます。(私はそれをテストしていません。)

s = cell2mat(arrayfun(@(id) ID(id), ids,'UniformOutput',false));
于 2012-06-05T15:26:43.673 に答える
2

これは私がオブジェクトの配列を作成する方法です:

s = ID.empty(0,5);
for i=5:-1:1
    s(i) = ID(i);
end

引数なしの「デフォルトコンストラクタ」を提供するか、少なくともデフォルト値を使用することは常に良い考えです。

classdef ID < handle
    properties
        id
    end
    methods
        function obj = ID(id)
            if nargin<1, id = 0; end
            obj.id = id;
        end
    end
end
于 2012-06-05T22:34:19.827 に答える