【问题标题】:Overloading operators in MATLAB to emulate hash-array在 MATLAB 中重载运算符以模拟哈希数组
【发布时间】:2010-12-13 15:35:43
【问题描述】:

是否可以重载subsrefsubsasgn 以允许索引值使用非整数类型?

h = Hash; #% a custom hash class to manage my data
h(100) = 'data'; #% integer is fine, if index > 0

h{'string'} #% but this fails
??? Cell contents reference from a
non-cell array object.

有人能破解它吗?


确切的解决方案:

containers.Map 中有几个烦恼,可以通过自定义类继承它来解决:

classdef Hash < containers.Map
  # fun
end

在这样的类中,可以实现各种类型的键(不仅仅是一个!!)和方便用户操作的方法。也可以重新定义subsrefsubsasgn 以使用花括号和多个索引。不错!

【问题讨论】:

标签: matlab hash indexing operator-overloading


【解决方案1】:

无需破解。使用结构或containers.Map。它们是关联数组的原生 Matlab 数据结构。结构由字符串索引(有一些限制)。 container.Map 可以按字符串、非整数数字或其他数据类型进行索引。请参阅“帮助结构”和“帮助容器.Map”。 Map 使用括号进行索引,因此它的语法看起来像一个通过其他方式索引的数组。

>> m = containers.Map(.1, 'myvalue');
>> m(.75) = 'anothervalue';
>> x = m(.1)
x =
myvalue
>> 

【讨论】:

  • 谢谢!如果需要添加更多方法,也可以继承它。非常好!
  • +1 -- 我使用 Matlab 已有 12 年了,不知道那个。
  • @Jason S:别难过;它是 R2008b 的新版本,并且在 doco 或其他方面没有得到很好的宣传。我去年才偶然发现它。
【解决方案2】:

为什么不直接使用java.util.HashMap? Matlab 在 Java 上运行良好。 (虽然我猜这仅适用于可以编组到 Java 中的数据,所以虽然矩阵和矩阵的元胞数组都可以,但结构已经过时了)

>> x = java.util.HashMap;
>> x.put(3, [1 2 3]);
>> x.put('Rosebud',[4 5 6; 7 8 9]);
>> x.put([2 4 6 8],'Michaelangelo'); 
>> x.get(3)

ans =

     1
     2
     3

>> x.get('Rosebud')

ans =

     4     5     6
     7     8     9

>> x.get([2 4 6 8])

ans =

     []

啊哈:注意最后一点——Java 中数字和字符串的相等语义很简单,但对于数组,事情就变得棘手了,在 MATLAB 中使用 Java 有点像在手套箱中处理实验室样本。

如果您可以处理 java.util.HashMap 的限制(键相等语义,对可以在 Java 和 MATLAB 之间编组的类型限制),请使用它 - 否则您可能必须自己编写。

【讨论】:

  • @Jason,您能否举例说明如何在 MATLAB 中创建一个简单的哈希数组?我没有使用 Java 的经验
  • @Jason,谢谢,Java 类可能有很多优点。但是,我想避免方法调用(get/set)并且只使用括号。
  • @Jason,用 .get 和 .set 方法创建一个 Hash 类需要几分钟,这比java.util.HashMap 更好用。
  • 酷,如果你不介意,你能发帖吗?我还没有习惯新的 MATLAB 类语法,+ 这将是一个很好的例子。
  • @Jason,这对我来说需要更多时间 :) 你可以看看stackoverflow.com/questions/3591942/hash-tables-in-matlab 有指向 MATLAB Central 的链接以及现成的示例。
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 2012-09-20
  • 1970-01-01
  • 2012-04-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多