所以我有一个名为agent的类,它具有以下属性:
classdef agent < handle
properties
x
v
goal
v_pref
end
这里,x和v是1乘2的向量。让我们假设我有一个n-by-1对象数组,其中数组的每个部分都包含一个名为agent的类的实例。目前,我无法覆盖代码的赋值行为。每当我做这样的事情时:
obj.x([1;3], 1) = [ 5; 3];
我想分别用5和3覆盖x的对象1和3的第一个元素。
基本上我希望这些命令与上面的命令相同
obj(1).x(1) = 5;
obj(3).x(1) = 3;
有没有办法在matlab中使用subsasgn或任何其他重载函数来执行此操作。
答案 0 :(得分:0)
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&#39; documentation,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
>>
可能的引用:&#34;表达式a(:)不会生成单个输出对象,而是生成它们的流。 MATLAB还没有被设计为对它们的流应用两级索引。它可以做到这一点(:)。b,但显然不是这个(:)。b.c&#34; https://www.mathworks.com/matlabcentral/newsreader/view_thread/245627