Matlab:快速实现赋值运算符(subsasgn)多级对象/数组对象。

时间:2014-08-10 22:19:41

标签: matlab operator-overloading

所以我有一个名为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或任何其他重载函数来执行此操作。

1 个答案:

答案 0 :(得分:0)

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&#39; documentationS(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