罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

分析使用不同的数据结构的地址

最近,在MathWorks,赛斯决定为在他的博客上评论分析电子邮件域。他有趣的编写代码并在内部发布它。在很短的时间内,其他几个解决方案出现,其中包括利用的一个新特性金宝搏官方网站R2008b:containers.Map。让我们先看看问题本身。

内容

的电子邮件地址列表

赛斯想知道有多少评论这个博客来自各个领域,例如,在每个位置“@”的象征。

这是由电子邮件地址的列表来赛斯的评论。

s = {“0123456789 @uni.ac.za”“alphabet_a@yahoo.com”“alphabet_b@gmail.com”“alpahbet_c@hotmail.com”“dAlphabet@xyzabc.com”“e_alphabet@yahoo.co.in”“falphabet@gmail.com”“loren.shure@mathworks.com”“loren@mathworks.com”“alphabetG@hanme.com”“alphabetH@bname.com”“alphabet_I@yahoo.co.in”“andJ@gmail.com”“Khere@gmail.com”“L-Student@erau.edu”“M@gmx.de”};

使用正则表达式和cellfun赛斯的解决方案

赛斯第一次使用正则表达式确定的位置“@”符号在每个地址。

s1 = regexp(年代,“@ (\ w) +”,“匹配”,“一次”);

未来赛斯发现独特的域名,发现名字最长的长度(使用后帮他打印结果)。

sunique =独特(低(s1));n =细胞(长度(sunique), 1);mx = max (cellfun (@length sunique));

最后,赛斯打印结果。

i = 1:长度(sunique) n{我}= (strmatch (sunique{},低(s1)));disp ([' 'sunique{我}repmat (' '[1 mx-length (sunique{我})))' 'num2str (n{我}))结束
@bname.com 1 @erau.edu 1 @gmail.com 4 @gmx.de 1 @hanme.com 1 @hotmail.com 1 @mathworks.com 2 @uni.ac。咱1 @xyzabc.com 1 @yahoo.co。在2 @yahoo.com 1

使用containers.Map戴夫的解决方案

我展示的是另一种解决方案戴夫Tarkowski,使用一个containers.Map对象。戴夫开始采用赛斯的代码来查找匹配。

s1 = regexp(年代,“@ (\ w) +”,“匹配”,“一次”);

接下来,创建一个对象的类containers.Map

m = containers.Map
m = containers.Maphandle Package: containers Properties: Count: 0 KeyType: 'char' ValueType: 'any'

遍历每个域,检查域名已经是一个关键的名字。

如果键不存在,创建它并将其值设置为1,否则现有键的值增加1。

i = 1:长度(s1)如果m.isKey (s1{我})m (s1{我})= m (s1{我})+ 1;其他的米(s1{我})= 1;结束结束

最后,打印出数据。

k =键(m) disp ([k {1}' 'num2str (m (k {1}))))结束
@bname.com 1 @erau.edu 1 @gmail.com 4 @gmx.de 1 @hanme.com 1 @hotmail.com 1 @mathworks.com 2 @uni.ac。咱1 @xyzabc.com 1 @yahoo.co。在2 @yahoo.com 1

containers.Map是什么?

containers.Map是一种数据结构通常称为哈希表或地图。您可以使用一个Java哈希表之前如果你设置为使用Java在MATLAB。现在你不再需要桥MATLAB-Java接口功能。的containers.Map这个数据结构类提供了一种节约内存的实现。MATLAB在类似的感觉结构体,一个容器。映射对象没有限制的关键(类似于一个领域结构体MATLAB是一个有效的标识符。键可以是任何下列之一:

  • 标量整数(签名或无符号)
  • 标量单引号或双
  • 1 xn字符数组,甚至和嵌入空格

有一些方法可以使用这些对象。

方法(m)
类容器的方法。地图:地图findobj isKey长度移除addlistener findprop isvalid lt大小值删除通用钥匙ne subsasgn eq gt le通知subsref

史蒂夫的使用嘘和独特的解决方案

史蒂夫的主出现了不同的解决办法。用他的话说:

而不是使用正则表达式(因为我不能记得正则表达式语言)cellfun,我用strtok,和第二个独特的调用。

把地址的符号

(T, R) = strtok(年代,“@”);

使用这一事实独特的给你bk这样b {k}= =R

(后缀,忽略,k) =独特(低(R));

使用这一事实独特的它的输出以及去除重复。发送相关的输出

(数量、指标)=嘘(k,独特的(k));

打印结果。

[后缀,num2cell(计数”)]。
ans =“@bname.com”[1]“@erau.edu”[1]“@gmail.com”[4]“@gmx.de”[1]“@hanme.com”[1]“@hotmail.com”[1]“@mathworks.com”[2]“@uni.ac。咱”[1]“@xyzabc.com”[1]“@yahoo.co。在“[2]“@yahoo.com”[1]

罗兰的解决方案使用strfind和accumarray

我来晚了这个游戏。之前看到任何解决方案除了赛斯的,我想金宝搏官方网站到了使用strfind定位领域,accumarray收集数据。

第1 = strfind(年代,“@”);印第安纳州allSuffixes = cellfun (@ (str) str(印第安纳州:结束),年代,第1,“UniformOutput”、假);[uniqueSuffixes,忽略,uind] =独特(低(allSuffixes));%我疏忽使用accumarray如果没有解决方案数量= accumarray (uind 1[长度(uniqueSuffixes) 1]);[uniqueSuffixes num2cell(计数)
ans =“@bname.com”[1]“@erau.edu”[1]“@gmail.com”[4]“@gmx.de”[1]“@hanme.com”[1]“@hotmail.com”[1]“@mathworks.com”[2]“@uni.ac。咱”[1]“@xyzabc.com”[1]“@yahoo.co。在“[2]“@yahoo.com”[1]

其他方面,其他数据结构?

毫无疑问,是的,有其他的方式来完成同样的任务,包括计算之类的一些想法这篇文章。你有其他喜欢的方式做这种任务?除了containers.Map,其他数据结构在MATLAB你想看吗?像往常一样,请把你的想法在这里




使用MATLAB®7.7发表


  • 打印

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그인하거나계정을새로만드십시오。