Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Matlab';s arrayfun用于类对象的统一输出_Oop_Class_Matlab - Fatal编程技术网

Oop Matlab';s 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

我需要使用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(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