【问题标题】:Call a function with several properties of an object调用具有对象的多个属性的函数
【发布时间】:2014-12-27 18:52:37
【问题描述】:

对于 (MEX) 函数调用,一次传递一个对象的多个属性会非常好。而不是foo(myObj.propA, myObj.propB),我想要foo(myObj.[propA,propB]之类的东西。

这可能吗?

使用结构可以使用getfield() 函数从多个字段中获取数据,例如:

getfield(myStruct, {index}, {'fieldA', 'fieldB'})

但不幸的是,以下尝试从对象中获取多个属性会导致错误(索引超出矩阵维度):

getfield(myObj, {index}, {'propA', 'propB'})

也许唯一的可能是编写一个返回多个输出参数的函数:

[varargout] = getProps(object,propnames)

for p=1:numel(propnames)
    varargout{p} = object.(propnames{p});
end

但是,如果我以该函数作为输入调用另一个函数,例如sum(getProps(myObj,propnames)) 只传递了getProps 的第一个输出参数,我陷入了绝望。有没有其他办法?

【问题讨论】:

    标签: matlab function oop properties


    【解决方案1】:

    对于一个对象,你应该使用get,而不是getfield(或者像你展示的那样在循环中动态访问)。

    >> h = figure;
    >> get(h,{'Position','Renderer'})
    ans = 
        [1x4 double]    'opengl'
    

    这不适用于所有对象,但对于 MATLAB 图形对象它确实有效。要处理任何类,您可以使用您的函数,但使用自定义单元格输出而不是 varargout

    function C = getProps(object,propnames)
    
    for p = 1:numel(propnames),
        C{p} = object.(propnames{p});
    end
    

    然后在您编写的任何函数中,您都可以使用C{:} 获得所有属性的逗号分隔列表,这将适用于期望每个属性名称输入作为单独参数的函数(例如C = getProps(myObj,propnames); x = myFun(h,C{:})

    【讨论】:

    • 也许我的 Matlab R2011b 太旧了,但输入并没有真正单独提供给函数。例如,对于具有属性值 A=1B=3 的对象:C = getProps(obj,{'A' 'B'}) 给出 C =[1] [3]C{:}返回逗号分隔列表 ans = 1; ans = 3 但 sum(C{:}) 返回 ans = 1
    • @JaBe 然后执行myfun(C{:}) 将给myfun 两个输入。当您执行sum(C{:}) 时,这相当于sum(1,3),它计算第三维 上的总和,而不是两个数字的总和。您需要连接以获得一个信号数组:[C{:}]
    • @JaBe 如果这为您提供了此问题所需的信息,请接受。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多