我需要使用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);
不起作用。感谢。
答案 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