【问题标题】:setting object properties value for object array in matlab在matlab中为对象数组设置对象属性值
【发布时间】:2013-06-11 07:53:09
【问题描述】:

我创建了一个对象数组,我想在向量操作中分配一个属性值,而不使用 for 循环。不幸的是我得到一个错误。

问题的简化示例。

classdef clsMyClass < handle
   properties 
      dblMyProperty1
   end 
   methods
        function obj = clsMyClass()
        end      
   end
end 

并且在运行时

vecMyArray = clsMyClass.empty(100,0);
vecMyArray(100) = clsMyClass;    
vecMyArray.dblMyProperty1 = 1:100;    

我们得到以下错误:

???点名称中右侧元素的数量不正确 任务。左侧缺少 [] 可能是原因。

任何帮助将不胜感激。

【问题讨论】:

  • 我的两分钱:for 循环可能是您最快的解决方案。第一行代码 (.empty(...)) 也没有做任何事情,它的效果立即被第二行代码替换。
  • 感谢 MATLAB 的矢量化,您这样做是“错误的”。考虑将类“由内而外”——与其拥有一个对象数组,不如拥有一个其属性本身就是数组的对象。见this treatise on MATLAB and OOP
  • @DangKhoa,我计划只拥有 20 个包含多个大型数组的对象。我想一次调用这 20 个对象的方法并更改它们的属性。
  • @Bee,谢谢你是对的。我添加了这一行,因为这里解释了原因:stackoverflow.com/a/7879881/903186
  • 你在初始化对象吗?为什么不在类定义中使用默认值设置属性?

标签: arrays matlab object properties


【解决方案1】:

我明白你现在要做什么了。使用 MATLAB File Exchange 中的disperse

>> [vecMyArray.dblMyProperty1] = disperse(1:100);
>> vecMyArray(1).dblMyProperty1
ans = 
    1
>> vecMyArray(10).dblMyProperty1
ans = 
    10

【讨论】:

  • 我认为这会解决我的问题。不幸的是,我使用的是 MATLAB 版本 7.9.1.705 (R2009b) SP1,这给出了错误:??? Undefined function or method 'disperse' for input arguments of type 'double'. 因此我无法验证您的解决方案
  • 这不是内置函数,它来自 MATLAB 文件交换。点击链接下载。
【解决方案2】:

您可以将deal 函数用于此目的:

[vecMyArray.dblMyProperty1] = deal(1:100);

见:http://www.mathworks.com/company/newsletters/articles/whats-the-big-deal.html


编辑:不,实际上你不能;这会将它们全部设置为矢量 1:100。

【讨论】:

    【解决方案3】:

    我想你会在“结构数组错误”中找到答案here。即使这是一个类,也适用类似的规则。

    不幸的是,缺少 [] 不是原因,因为添加它们会导致更多错误。原因是你不能一次为所有同名字段分配相同的值,你必须一次一个,如下代码:

    所以你需要:

    for ii=1:100
      vecMyArray(ii).dblMyProperty1 = ii;
    end
    

    我知道这并不令人满意,但我认为它至少有助于我们明确地理解这个错误。

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 1970-01-01
      • 2016-10-27
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2017-08-23
      • 2021-04-24
      相关资源
      最近更新 更多