2011-09-26 84 views
1

我是matlab的新手。作为更大问题的一部分,我需要在字符串数组中找到最大数量的字符串。java到matlab的转换

由于我在java中有一些经验,我已经用java编写了部分代码(只有当字符串数组中字符串的出现次数可以计算出来时,我才可以根据这些值对这个hashmap进行排序并解压缩)

int incr = 0; 
    String[] c = { "c1", "c2", "c3", "c1", "c2", "c2", "c2","c1","c2" }; 
    Map<String, Integer> classRegistry = new HashMap<String, Integer>(); 
    for (int i = 0; i < c.length; i++) { 
     String classes = c[i]; 
     if (!(classRegistry.containsKey(classes))) { 
      for (int j = i + 1; j < c.length; j++) { 
       if (classes.equals(c[j])) { 
        incr++; 
       } 
      } 
      classRegistry.put(classes, incr+1); 
      incr = 0; 
     } 
    } 

任何想法如何,我可以使用像MATLAB中的一个HashMap来计算阵列中的所有串出现的次数

感谢,

巴维亚

回答

2

MATLAB具有的功能TABULATE提供统计工具箱:

c = {'c1' 'c2' 'c3' 'c1' 'c2' 'c2' 'c2' 'c1' 'c2'}; 
t = tabulate(c) 
t = t(:,1:2) 

结果:

t = 
    'c1' [3] 
    'c2' [5] 
    'c3' [1] 

或者,您可以使用UNIQUEACCUMARRAY功能做同样的:

c = {'c1' 'c2' 'c3' 'c1' 'c2' 'c2' 'c2' 'c1' 'c2'}; 
[classes,~,subs] = unique(c); 
counts = accumarray(subs(:),1); 

同样的结果如前:

>> t = [classes(:) num2cell(counts)] 
t = 
    'c1' [3] 
    'c2' [5] 
    'c3' [1] 

然后找到发生的最多,使用的字符串:

>> [~,idx] = max(counts); 
>> classes(idx) 
ans = 
    'c2' 
+0

我使用了列表功能,很容易获得解决方案。 – bhavs

1

你没有指定你希望你的输入和输出数据类型如何,但我写了这个快速脚本,你可能会发现有用。

c = {'c1' 'c2' 'c3' 'c1' 'c2' 'c2' 'c2' 'c1' 'c2'}; 
count = struct(); 
for ic=1:length(c) 
    field = c{ic}; 
    if isfield(count, field) 
     count = setfield(count, field, getfield(count, field) + 1); 
    else 
     count = setfield(count, field, 1); 
    end 
end 

这个特定c输出将

count = 

    c1: 3 
    c2: 5 
    c3: 1 
0

既然你对Java的经验,你可以只写你的代码的Java和MATLAB调用它。如果你决定走这条路线,This techdoc article应该可以帮助你开始。但它很可能是更有益的学习如何做,在M-脚本(参见jomb87的答案)

顺便说一句,如果你把哈希表的另一个优点,你可以改善你的Java算法的性能:

for (int i = 0; i < c.length; i++) { 
     String classes = c[i]; 
     if (classRegistry.containsKey(classes)) { 
      classRegistry.put(classes, classRegistry.get(classes) + 1); 
     } else { 
      classRegistry.put(classes, 1); 
     } 
    }