【问题标题】:Assign Array values to object Array in Matlab在 Matlab 中将数组值分配给对象数组
【发布时间】:2016-05-10 09:04:39
【问题描述】:

我有以下问题:

[obj(:).Radius] = arrayOfRadius;

我有一个数组,每个对象都有一个半径。尽管对象的大小与右侧的 arrayOfRadius 相同,但上面的代码不起作用。

我可以用 for 循环解决这个问题,当然:

for i = 1:length(obj)
   obj(i).Radius = arrayOfRadius(i);
end

这不是我想要解决的方法。我已经找到了“交易”功能。但是 deal 函数将整个 arrayOfRadius() 复制到每个对象中。

有人可以帮帮我吗?

非常感谢。

【问题讨论】:

    标签: arrays matlab object assign


    【解决方案1】:

    这是 MATLAB 索引中更令人讨厌的领域之一,我真的希望他们能够修复,尤其是图形句柄从双精度对象移动到对象,这使得如何同时设置多个对象的属性变得不直观。

    deal 存在一种解决方法,尽管它需要中间使用 num2cell

    % Initialize a structure
    obj(6).radius = 6;
    
    radii = [1 2 3 4 5 6];
    C = num2cell(radii);
    [obj(:).radius] = deal(C{:});
    

    返回:

    >> [obj.radius]
    
    ans =
    
         1     2     3     4     5     6
    

    根据需要。

    【讨论】:

    • 嘿嘿嘿相距20秒。做得很好。
    【解决方案2】:

    一个非常 hacky 的解决方案是获取数组并将其转换为单元数组,然后使用逗号分隔的列表来最终完成分配。假设 obj 已经声明,请执行以下操作:

    A = num2cell(arrayOfRadius);
    [obj.Radius] = A{:};
    

    num2cell 将数组转换为单个元素的元胞数组,A{:} 将元胞数组转换为逗号分隔的列表,我们会将每个元素分配到结构中的相应槽中。执行 obj.Radius 会将结构中的每个 Radius 字段解压缩到逗号分隔的列表中。因此上面的代码相当于做:

    [obj(1).Radius, obj(2).Radius, ..., obj(N).radius] = A(1), A(2), ..., A(N)
    

    NarrayOfRadius 中的元素总数。

    可重现的例子

    >> clear
    >> obj(4).Radius = 0;
    >> disp([obj.Radius])
         0
    
    >> arrayOfRadius = [1 2 3 4];
    >> A = num2cell(arrayOfRadius);
    >> [obj.Radius] = A{:};
    >> disp([obj.Radius])
         1     2     3     4
    

    我的两分钱...

    FWIW,使用for 循环方法实际上更具可读性。执行此解决方法确实会使代码混淆......特别是如果您只是将元素从数组复制到结构。该复制将执行多少次?如果只是一次或几次,请坚持使用for 循环以提高可读性。

    【讨论】:

    • 也非常感谢!这个过程经常重复很多元素。在这种情况下,for 循环要慢得多,所以我想用这种方法做“快速”版本。
    • @Diluvian 啊我明白了。在这种情况下,请使用 num2cell 和逗号分隔的列表。祝你好运!
    猜你喜欢
    • 2010-11-22
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    相关资源
    最近更新 更多