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

Assign Array values to object Array in Matlab

我有以下问题:

[obj(:).Radius] = arrayOfRadius;

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

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

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

这不是我想要解决问题的方式。我已经找到了 "deal" 函数。但是 deal 函数会在每个对象中复制整个 arrayOfRadius()。

有人可以帮帮我吗?

非常感谢。

这是 MATLAB 索引中最令人讨厌的地方之一,我真的希望他们能解决,尤其是将图形句柄从双精度对象移动到对象时,如何同时设置多个对象的属性变得不直观时间.

存在 deal, though it requires the intermediate use of num2cell 的解决方法:

% Initialize a structure
obj(6).radius = 6;

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

哪个returns:

>> [obj.radius]

ans =

     1     2     3     4     5     6

随心所欲。

一个非常 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 循环以提高可读性。