Matlab:快速实现赋值运算符(subassign)多层对象/数组对象



所以我有一个名为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或任何其他重载函数来做到这一点。

subsasgnsubsref的问题:

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

最新更新