所以我有一个名为agent的类,它具有以下属性:
classdef agent < handle
properties
x
v
goal
v_pref
end
这里,x和v是1 × 2向量。假设我有一个n × 1的对象数组,其中数组的每个部分都包含称为agent的类的实例。目前,我在重写代码的赋值行为时遇到了麻烦。每当我做这样的事情:
obj.x([1;3], 1) = [ 5; 3];
我想用5和3分别覆盖对象1和对象3的x的第一个元素。
我想让这些命令和上面的一样
obj(1).x(1) = 5;
obj(3).x(1) = 3;
是否有一种方法可以在matlab中使用subassign或任何其他重载函数来做到这一点。
subsasgn
和subsref
的问题:
>> obj([1,3])
ans =
1x2 agent array with properties:
x
v
goal
v_pref
>> obj([1,3]).x
ans =
0 5
ans =
0 3
>> obj([1,3]).x(2)
Scalar index required for this type of multi-level indexing.
>>
似乎Matlab不是设计来处理这个意图的。
同时,使用以下代码:
S(1).type='()';
S(1).subs={1,3};
S(2).type='.';
S(2).subs='x';
S(3).type='()';
S(3).subs={2};
subsref(obj,S)
根据Mathworks的文档,S(1).subs={1,3};
意味着访问obj(1,3),但不是obj([1,3])。将其更改为S(1).subs={[1,3]};
也会导致前面的错误。
这里有另一种方法。
将这个方法添加到类中:
methods
function storex(obj,ind,x)
if length(x) == 1
x = repmat(x,length(ind),1);
end
for ii = 1:length(ind)
obj(ind(ii)).x(2) = x(ii);
end
end
end
,称其为
>> obj.storex([1,3],8)
>> obj.x
ans =
0 8
ans =
[]
ans =
0 8
>> obj.storex([2,3],[4,3])
>> obj.x
ans =
0 8
ans =
0 4
ans =
0 3
>>
可能的引用:表达式a(:)不会产生单个输出对象,而是一个输出对象流。MATLAB只是没有被设计成对它们的流应用两级索引。它可以做到这一点(:)。B,但显然不是这个a(:)。https://www.mathworks.com/matlabcentral/newsreader/view_thread/245627