在Matlab中将数组值分配给对象数组

时间:2016-02-01 19:22:15

标签: arrays matlab object assign

我有以下问题:

[obj(:).Radius] = arrayOfRadius;

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

我可以用for循环来解决这个问题,确定:

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

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

有人可以帮帮我吗?

非常感谢。

2 个答案:

答案 0 :(得分:4)

这是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

根据需要。

答案 1 :(得分:4)

一个非常讨厌的解决方案是获取数组并将其转换为单元格数组,然后使用逗号分隔列表最终执行赋值。假设已经声明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循环以提高可读性。