Matlab的arrayfun类对象的统一输出(Matlab's arrayfun for

2019-09-17 18:49发布

我需要建立类对象的数组ID使用arrayfun:

% 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); 不工作。 谢谢。

Answer 1:

你问arrayfun做一些它不是内置的事情。

从输出arrayfun必须是 :

标量值(数字,逻辑,字符或结构)或细胞阵列。

对象不计入任何标量类型的,这就是为什么“变通办法”都涉及使用电池阵列的输出。 有一点要尝试使用cell2mat的输出转换成你想要的格式; 它可以在同一行中完成。 (我没有,虽然进行了测试。)

s = cell2mat(arrayfun(@(id) ID(id), ids,'UniformOutput',false));


Answer 2:

也许最简单的方法是使用cellfun,或迫使arrayfun通过设置返回单元阵列'UniformOutput'选项。 然后可以将此单元阵列转换成obects的阵列(与使用上述猫)。

s = arrayfun(@(x) ID(x), ids, 'UniformOutput', false);
s = [s{:}];


Answer 3:

这是我会怎样创建一个对象数组 :

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


文章来源: Matlab's arrayfun for uniform output of class objects
标签: oop class matlab