Matlab Array 存储任何碱基的数字
Posted
技术标签:
【中文标题】Matlab Array 存储任何碱基的数字【英文标题】:Matlab Array which stores numbers of any base 【发布时间】:2014-08-07 20:37:25 【问题描述】:这是我编写的第一个 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】:您几乎可以正常工作。让我们总结一下您需要进行哪些更改才能使其充分发挥作用:
(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) 当您添加数字时,当您创建初始对象时,由于base2dec
的性质,您的Value
属性实际上将是一个列 数字。因此,您需要垂直而不是水平连接数字。因此,您的 add 方法必须是:
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) 您在get
方法的末尾错过了end
语句
(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
【讨论】:
'2','4','8' = arrayfun(@(x) num2str(x), [2,4,8], 'UniformOutput', false)
@Yvon - 虽然那肯定是等价的....我更喜欢'2','4','8'
:)。不过观察力很好。
是的,我现在看到了。使用[2,4,8]
,您只能有十进制输入。使用字符串可以取'A', '10D'
左右。
@Yvon - 哇,我完全忘记了十六进制。好收获!
@Erty - 迟到总比没有好。感谢您的接受。以上是关于Matlab Array 存储任何碱基的数字的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB从入门到精通-新增返回数组高宽数字特征的全新方式