您的位置:首页 > 理论基础 > 数据结构算法

Matlab使用Java的数据结构类型

2015-11-03 20:45 447 查看


Matlab使用Java的数据结构类型

Matlab 2008b才开始引入containers.Map,这是Matlab唯一的数据结构(这里的数据结构是指自带一定逻辑性的数据结构,不包括普通数据类型)。如果要有其它,比如Queue、Set等数据结构,只能自己编写一个。File Exchange上有不少人做过这个工作,我也写过Queue、List、Vector的Matlab对象。不过Matlad的面向对象编程效率极低,这种方法只能用于不太注重效率的场合。解决这个问题的另外一个方法是使用Java对象。

Matlab 6.0开始集成Java,自此可以很方便地使用Java的数据结构类型。跟数据结构相关的是java.util,里面有超过20个数据结构类型,这里有详细的类型的介绍。而这其中常用的有下面几个:

Set类:指一个集合,其中不允许有重复元素。根据具体的实现方法,Matlab可以使用以下类型:

EnumSet:集合元素类型需要一致;速度最快

HashSet:hash表;速度也比较快

LinkedHashSet:hash表,但元素之间根据插入顺序链接;比Hash表慢

TreeSet:红黑树实现的Set类,速度相对较慢;

List类:指一个顺序列表

Vector:一个容量可变的数组向量

Stack:后进先出,栈

LinkedList:链表

ArrayQueue

PriorityQueue:优先树

Map类:指一个从keys到values的映射关系

EnumMap:keys的类型一样,和EnumSet类似

HashMap:利用hash表保存

HashTable:线程安全的HashMap

TreeMap:利用红黑树实现的Map

LinkedHashMap:一个HashMap,但元素之间根据插入顺序互相链接。

使用方法很简单。不需要对Matlab做任何配置。比如下面定义一个HashMap:
mapTest = java.util.HashMap;


然后对mapTest的操作可参考Java文档对HashMap对象的描述,或者可通过methodsview(map)查看map可用的函数。

最后还是需要说下效率。唯一可以用来对比的只有Matlab内置的containers.Map和与Java对象HashMap。

测试发现,containers.Map的效率优于HashMap,但只快约10%。
http://www.kuqin.com/algorithm/20121209/333928.html
................................................................................................................................

matlab中hash和map的用法总结 
若要在matlab中使用hash,有两种方式:
(1)采用matlab官方给出的结构类型map(containers.Map):
http://cn.mathworks.com/help/matlab/map-containers.html (2)调用Java中的hashmap或者hashtable
(2.1)hashtable的具体示例: http://blog.csdn.net/chaosstar/article/details/8268602  哈希表是一种很有用的数据结构,其可由关键字(key)直接定位到数据值(value);在很多应用中,使用哈希表可以方便高效地达到目的。
       但哈希表并不是matlab内置数据类型,所以要在matlab中使用哈希表就比较麻烦了;幸好,matlab提供了一种调用Jave哈希表的方法,让我们可以间接的使用哈希表。
   废话少说,直接上代码:
-------------------------------------------------------------------
% 以下代码功能为:统计文本中单词出现的次数(包括数字,但不包括标点)
text ='In computing, a hash table (also hash map) is a datastructure used to implement an associative array, a structure that can map keysto values. A hash table uses a hash function to compute an index into an
arrayof buckets, from which the correct value can be found.';
word_cell = regexp(text,'\w+','match');% 使用正则表达式分割文本中的字符
word_ht = java.util.Hashtable;% 生成哈希表的对象
% 遍历文本单词cell,并统计单词出现次数
for ii =1: length(word_cell)
    lower_word = lower(word_cell{ii});% 转换为小写字符
    if word_ht.containsKey(lower_word)% 单词是否已在关键字列表中
        word_ht.put(lower_word, word_ht.get(lower_word)+1);% 使用 ht.put(key, value) 将单词及其出现次数保存到哈希表中
    else
        word_ht.put(lower_word,1);
    end
end
word_list = word_ht.keys;% 获取关键字列表
% 输出所有单词及其出现次数(并无排序)
while( word_list.hasNext )% word_list.hasNext为真说明下一个元素存在,否则已遍历到列表尾
    word = word_list.nextElement;% 获取下一个关键字
    fprintf('%s : %d\n', word, word_ht.get(word)); % 使用 ht.get(key) 可得到key对应的value,即 value = ht.get(key)
end
-------------------------------------------------------------------------------------------
(2.2)hashmap具体示例: http://blog.chengsite.com/?p=345​  
注意:
hashtable、hashmap和map的区别还是有不少的,比如内存机制不同,对于较大规模数据,用hash效率更高。
参考:http://www.cnblogs.com/lidabo/archive/2013/08/12/3253045.html​
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: