Java 在Matlab中生成向量的Hashmap

Java 在Matlab中生成向量的Hashmap,java,matlab,hashmap,hashtable,Java,Matlab,Hashmap,Hashtable,我需要Matlab中类似hashmap的功能,其中hashmap将向量映射到其他向量,而向量的数量(数十万)事先是未知的 我尝试了Matlab的内置功能,但它不接受向量作为键。然后我尝试了java.util.HashMap: >> map = java.util.HashMap; >> map.put(1:3,zeros(2,1)); >> map.get(1:3) ans = [] 因此,出于某种原因,这似乎不起作用,即使Java的HashMap应

我需要Matlab中类似hashmap的功能,其中hashmap将向量映射到其他向量,而向量的数量(数十万)事先是未知的

我尝试了Matlab的内置功能,但它不接受向量作为键。然后我尝试了java.util.HashMap:

>> map = java.util.HashMap;
>> map.put(1:3,zeros(2,1));
>> map.get(1:3)

 ans =

 []
因此,出于某种原因,这似乎不起作用,即使Java的HashMap应该能够将数组映射到数组

另一种选择是保留两个单独的矩阵,一个用于键,一个用于值,并以增量方式增长它们。但我不想真的这样做,因为在Matlab中,增量增长(即使是块大小增量等)会带来痛苦

问题: 1.为什么Java的HashMap在这里不起作用? 2.还有其他方法吗


谢谢。

这是一个能满足你需要的难题

map = java.util.HashMap;    
key = java.util.Vector;

matKey = 1:3;
for nn=1:numel(matKey)  
    key.add(matKey(nn));
end

map.put(key,zeros(2,1));
map.get(key)

…无论如何,这是一个起点。

我将containers.Map与char键(感谢Andrew Janke)进行了比较,并将java.util.HashMap与包装器对象作为键进行了比较(同样感谢Andrew Janke和Rasman指出):

结果:

>> testmaps
Elapsed time is 58.600282 seconds.
Elapsed time is 97.617556 seconds.
容器。地图是赢家


编辑:我重新运行了numvec=10^6的测试,其他一切都一样。容器。Map方法在59秒内运行。HashMap方法在5分钟后未完成,导致Matlab没有响应



Edit2:我还尝试预先分配两个单独的矩阵,并使用
ismember
查找键。性能比HashMap差。

我最近不得不处理一个类似的问题,不是向量问题,而是数组问题


Matlab有一个函数mat2str函数,用于将矩阵转换为字符串。如果不需要向量在HashMap中动态增长,可以将向量表示为字符串,并将其用作键/值。在某些情况下,这可能没有多大帮助,但如果事情是静态的,这是一个快速而肮脏的解决方案。

检查关键向量中的值的范围是什么?如果它们是小于2^16的整数,您可以将它们转换为
char
,并使用生成的有趣字符串作为键。谢谢大家的回答。键向量实际上是2^16下的整数,所以我比较了使用containers.Map和char键以及java的HashMap,它们的键类似于post Rasman链接到的键:好的,在这里发布的代码太多了,所以我将它作为一个答案发布。再想一想,你可以使用任何键向量值,而不仅仅是整数<2^16,通过使用
typecast
在字符中粘贴任意值的位模式,比如
charKey=char(typecast(key,'uint16'))
@Andrew:我错过了你最后的评论。由于某些原因,我没有收到电子邮件通知。{typecast}不会导致冲突吗?也就是说,两个不同的数字>2^16给出了相同的类型转换?这可能会起作用,而且比“乱七八糟”要好,但你必须小心——当我认为OP希望能够按值提取条目时,在
key
中重用Java对象实例有点作弊。OP的代码不起作用,因为Matlab
1:3
被转换为Java原语双数组,该数组具有相同的标识语义。如果最终得到一个double向量,那么第一个示例将有效,它将具有按值相等的语义。不确定转换将如何进行;您可能需要通过执行
key.add(java.lang.Double(matKey(nn)))来强制执行它
。第二个示例可能不起作用-
key.add(1:3)
以一个长向量double[]结束,该向量以恒等式结束。我认为您将无法使用不同的
1:3
将值提取出来;您需要原始的
对象。例如,如果您执行
key2=java.util.Vector;键2.添加(1:3);map.get(key2)
,它是否检索该值?因为我认为这就是OP需要它工作的地方。@AndrewJanke你是对的。经过测试,kludge2实际上不起作用。RemovedCool。containers.Map的性能优于containers.Map是有道理的:来自M代码的每个Java调用都有开销,并且密钥转换使用多个调用,并且随着密钥长度的增加而增加。
>> testmaps
Elapsed time is 58.600282 seconds.
Elapsed time is 97.617556 seconds.