这是我编写的第一个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]
有人能指出我正确的方向吗?
答案 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