是否可以重载subsref
和subsasgn
以允许非整数类型作为索引值?
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
在这样的类中,可以为用户操作实现各种类型的键(不仅仅是一个!!)和便利方法。此外,还可以重新定义subsref
和subsasgn
以使用花括号和多个索引。尼斯!
答案 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>