罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已退役,不会更新。

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

最近,在MathWorks,赛斯决定分析一下他博客上的评论。他很享受编写代码并在内部发布的过程。在很短的时间内,出现了其他几个解决方案,其中一个利用了金宝搏官方网站R2008b容器。地图.让我们先看看问题本身。

内容

电邮地址一览表

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

这是一个虚构的电子邮件地址列表,供塞斯发表评论。

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”};

Seth使用regexp和cellfun的解决方案

赛斯第一次使用正则表达式以确定的位置“@”符号。

S1 = regexp(s,“@ (\ w) +”“匹配”“一次”);

接下来,Seth找到唯一的域名,并找到最长名称的长度(稍后用于帮助他打印结果)。

Sunique =唯一的(低(s1));N = cell(length(sunique),1);Mx = max(cellfun(@length,sunique));

最后,Seth打印结果。

I =1:长度(sunique) n{I} =长度(strmatch(sunique{I},lower(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

戴夫使用容器的解决方案。地图

下一个解来自戴夫Tarkowski,并使用容器。地图对象。Dave首先采用Seth的代码来查找匹配项。

S1 = regexp(s,“@ (\ w) +”“匹配”“一次”);

接下来,创建类的对象容器。地图

M =容器。地图
M =容器。地图handle Package: containers Properties: Count: 0 KeyType: 'char' ValueType: 'any'

现在遍历每个域,检查域名是否已经是密钥名。

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

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

最后,打印出统计数据。

K = key (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

什么是集装箱地图?

容器。地图数据结构通常被称为哈希表或地图。如果您准备在MATLAB中使用Java,那么您以前可以使用Java哈希表。现在,您不再需要桥接MATLAB-Java接口来实现此功能。的容器。地图类提供此数据结构的内存高效实现。虽然在感觉上类似于MATLAB结构体,一个集装箱。地图object does not limit the key (similar to the field of a结构体为有效的MATLAB标识符。键可以是以下任意一个:

  • 标量整数(有符号或无符号)
  • 单或双标量
  • 1 xn字符数组,即使是嵌入空格

你可以在这些对象上使用一些方法。

方法(m)
类容器的方法。地图:地图findobj isKey length remove values addlistener findprop isvalid lt size delete ge keys ne subsasgn eq gt le notify subsref

史蒂夫的解决方案使用历史和唯一

史蒂夫的主于是有了一个不同的解决方案。用他的话来说:

而不是使用正则表达式(因为我总是记不住正则表达式语言)和cellfun,我用过strtok还有一点独特的调用。

拆分at符号处的地址

[T, R] = strtok(s;“@”);

利用这个事实独特的给你b而且k这样b {k}= =R

[后缀,忽略,k] = unique(lower(R));

利用这个事实独特的对输出进行排序并删除重复项。将相关输出发送到

[counts, indices] = hist(k, unique(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]”@yahoo.co。在[2]@yahoo.com [1]

利用strfind和accumarray的Loren解

这次我来晚了。在看到除了Seth的解决方案之外的任金宝搏官方网站何解决方案之前,我考虑使用strfind定位域,和accumarray收集数据。

Inds = strfind(s,“@”);所有后缀= cellfun(@(str,ind) str(ind:end), s, inds,...“UniformOutput”、假);[uniqueSuffixes,ignore,uind] = unique(lower(allSuffixes));如果没有使用accumarray的解决方案,那就是我的疏忽。counts = accumarray(uind,1,[length(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]”@yahoo.co。在[2]@yahoo.com [1]

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

是的,毫无疑问,还有其他方法来完成同样的任务,包括一些关于计数的想法这篇文章.你还有其他喜欢的方法来完成这类任务吗?除了容器。地图,您希望在MATLAB中看到哪些其他数据结构?像往常一样,请发表你的想法在这里




使用MATLAB®7.7发布

|
  • 打印
  • 发送电子邮件