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从入门到精通-新增返回数组高宽数字特征的全新方式

matlab读取motorola编码

如何在数组中存储连续数字,bash脚本?

关于Matlab数字水印

matlab输入任何一个正数,对输入的数字进行四舍五入得到N ,计算1+2+。。。N

有没有办法在JAVA中没有任何ARRAY对整数的数字进行排序?