Matlab arrayfun用于类对象的统一输出

时间:2012-06-05 13:05:40

标签: oop class matlab

我需要使用arrayfun:

构建类ID的对象数组
% 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);不起作用。感谢。

3 个答案:

答案 0 :(得分:5)

也许最简单的方法是使用cellfun,或者通过设置'UniformOutput'选项强制arrayfun返回一个单元格数组。然后你可以将这个单元格数组转换为一个obects数组(与上面的cat一样)。

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

答案 1 :(得分:3)

你要求arrayfun做一些不能做的事情。

The output from arrayfun must be

  

标量值(数字,逻辑,字符或结构)或单元格   阵列。

对象不算作任何标量类型,这就是为什么“变通方法”都涉及使用单元格数组作为输出。要尝试的一件事是使用cell2mat将输出转换为您想要的形式;它可以在一行中完成。 (虽然我没有测试过。)

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

答案 2 :(得分:2)

这是我创建array of objects

的方法
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