存储任何基数的Matlab数组

时间:2014-08-07 20:37:26

标签: arrays matlab oop

这是我编写的第一个Matlab代码,所以它可能非常粗糙。

一位朋友在Matlab工作并提到他们想要一个可以在任何基础上获取和返回数字的数组。这就是我想出来的,但它没有用。

classdef BaseArray
   properties
      Value
   end
   methods
      function obj = BaseArray(Elements, Base)
        Value = base2dec(Elements, Base)
      end
      function add (Obj, Element, Base)
        % This might need some sort of "void" return type
        Obj.Value = [Obj.Value base2dec(Element, Base)]
      end
      function get (Obj, Base)
        % How do I get this to actually return
        str2num(dec2base(Obj.Value, Base))
   end
end

当我试着打电话时

a=BaseArray([011, 101, 110], 2)

从同一个文件(这是错误的?)我得到一个错误,说明没有定义BaseArray。

我希望班级能够像这样工作:

a=BaseArray([2, 4, 8], 10)
a.Add(10, 3)
a.get(2)
% returns [10, 100, 1000, 11]

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

你差不多了。让我们总结一下您完成这项工作所需的变更摘要:

(1)如果希望对象在运行方法后保持其更改,则需要从handle类继承。这可以通过在您的classdef定义中附加以下内容来完成:

classdef BaseArray < handle

查看有关原因的相关帖子:How to modify properties of a Matlab Object

(2)base2dec需要字符串表示该数字。因此,您无法使用数组或MATLAB会抱怨。因此,当您创建类型为BaseArray的对象时,您需要这样做:

a = BaseArray({'2', '4', '8'}, 10);

请注意我声明了一个cell字符串数组。我们不能把它扔进一个普通的数组,否则字符串只会相互连接,它会形成一个248的字符串,这显然不是我们想要的。

(3)当您添加数字时,在创建初始对象时,由于其性质,您的Value属性实际上将是数字base2dec。因此,您需要将数字垂直而不是水平连接。因此,您的添加方法必须是:

  function add(obj, Element, Base)
    %//This might need some sort of "void" return type
    obj.Value = [obj.Value; base2dec(Element, Base)];
  end

另外,请务必以这种方式致电add

a.add('3', 10);

...不像以前那样a.add(10,3)。你翻了数字和基数......你还需要确保3是一个字符串。

(4)您在end方法结束时错过了get语句

(5)get方法几乎是正确的。您只需创建一个输出变量,并将str2num的调用分配给该变量。就这样:

  function val = get(obj, Base)
    %//How do I get this to actually return
    val = str2num(dec2base(obj.Value, Base));
  end

通过所有这些,这就是你的最终类定义。确保将其保存到名为BaseArray.m的文件:

classdef BaseArray < handle
   properties
      Value;
   end
   methods
      function obj = BaseArray(Elements, Base)
        obj.Value = base2dec(Elements, Base);
      end
      function add(obj, Element, Base)    
        obj.Value = [obj.Value; base2dec(Element, Base)];
      end
      function val = get(obj, Base)
        val = str2num(dec2base(obj.Value, Base));
      end
   end
end

按照你的例子,我们有:

a = BaseArray({'2', '4', '8'}, 10);
a.add('3', 10);
b = a.get(2);

b告诉我们:

b =

      10
     100
    1000
      11