在MATLAB中重载运算符以模拟散列数组

时间:2010-12-13 15:35:43

标签: matlab hash indexing operator-overloading

是否可以重载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以使用花括号和多个索引。尼斯!

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

为什么不使用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 =

     []

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

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