我有以下问题:
[obj(:).Radius] = arrayOfRadius;
我有一个半径为每个对象的数组。尽管该对象与右手arrayOfRadius具有相同的大小,但上面的代码不起作用。
我可以用for循环来解决这个问题,确定:
for i = 1:length(obj)
obj(i).Radius = arrayOfRadius(i);
end
这不是我想要解决的方式。我已经找到了“交易”功能。但是,交易功能会复制每个对象中的整个arrayOfRadius()。
有人可以帮帮我吗?
非常感谢。
答案 0 :(得分:4)
这是MATLAB索引中比较讨厌的领域之一,我真的希望他们能够解决这个问题,尤其是将图形句柄移动到双打对象时,如何同时设置多个对象的属性是非直观的。
% 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)
N
是arrayOfRadius
中的元素总数。
>> 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
循环以提高可读性。