Oop Matlab';s arrayfun用于类对象的统一输出
我需要使用arrayfun构建类Oop Matlab';s arrayfun用于类对象的统一输出,oop,class,matlab,Oop,Class,Matlab,我需要使用arrayfun构建类ID的对象数组: % ID.m classdef ID < handle properties id end methods function obj = ID(id) obj.id = id; end end end 我可以在循环中交替构建它: s = []; for k = 1 : length(ids) s = cat(1, s, ID(i
ID
的对象数组:
% ID.m
classdef ID < handle
properties
id
end
methods
function obj = ID(id)
obj.id = id;
end
end
end
我可以在循环中交替构建它:
s = [];
for k = 1 : length(ids)
s = cat(1, s, ID(ids(k)));
end
但是arrayfun的这种用法有什么不对呢
编辑(澄清问题):问题不是如何解决问题(有几种解决方案),而是为什么使用简单语法
s=arrayfun(@(id)id(id),id)代码>不起作用。谢谢。也许最简单的方法是使用cellfun,或者通过设置'UniformOutput'
选项强制arrayfun返回单元格数组。然后可以将此单元格数组转换为OBECT数组(与上面使用cat相同)
您正在要求arrayfun
做一些它不是专门为做的事情
:
标量值(数字、逻辑、字符或结构)或单元格
数组
对象不算作任何标量类型,这就是为什么“变通方法”都涉及使用单元格数组作为输出的原因。可以尝试的一件事是使用cell2mat
将输出转换为所需的格式;它可以在一行中完成。(不过我还没有测试过。)
这就是我如何创建一个:
最好提供一个没有参数的“默认构造函数”,或者至少使用默认值:
classdef ID < handle
properties
id
end
methods
function obj = ID(id)
if nargin<1, id = 0; end
obj.id = id;
end
end
end
classdef ID 如果是Nargin,谢谢,但它看起来像一个补丁,就像循环方法一样。我的问题是为什么arrayfun(@(id)id(id),id)
不起作用。这是Matlab的错误,还是错误的用法?因为我有时会错过python的功能,无法无限扩展命令,并且经常使用单元格来构建数组,所以我经常声明一个匿名函数来一次性实现:dealcell=@(x)x{:}
,然后可以像s=[dealcell(arrayfun(…))]那样使用
您需要s=restrape(s,size(id))
使其真正匹配arrayfun
实际上CELL2MAT将失败并出现错误无法支持包含单元格数组或对象的单元格数组。
@Amro啊,很有趣。谢谢你指出这一点,就像我说的,我没有测试过它。有没有办法将对象的句柄转换成向量?你可以创建对象数组(我给出了答案),但不能使用ARRAYFUN。事实上,ARRAYFUN可以迭代对象数组(作为输入),但不能将它们作为输出返回(必须返回您指出的单元格标量)。你也可以像@robince展示的那样做
s = arrayfun(@(x) ID(x), ids, 'UniformOutput', false);
s = [s{:}];
s = cell2mat(arrayfun(@(id) ID(id), ids,'UniformOutput',false));
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