преобразование Java в Matlab - PullRequest
       19

преобразование Java в Matlab

1 голос
/ 26 сентября 2011

Я новичок в Matlab.Как часть более крупной проблемы, мне нужно найти максимальное количество вхождений строки в массиве строк.

Поскольку у меня есть некоторый опыт работы с Java, я написал частичный код на Java (только доколичество вхождений строки в массив строк можно вычислить. Я могу отсортировать хеш-карту в зависимости от значений и извлечь ее)

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

Любая идея, как я могу использовать что-то вроде hashMap в MATLAB для вычисленияколичество вхождений всех строк в массиве

Спасибо,

Бхавья

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

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]

В качестве альтернативы, вы можете сделать то же самое, используя UNIQUE и ACCUMARRAY функции:

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'
1 голос
/ 26 сентября 2011

Вы не указали точное, как бы вы хотели, чтобы ваши типы входных и выходных данных были, но я написал этот быстрый скрипт, который может оказаться полезным.

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 голосов
/ 26 сентября 2011

Поскольку у вас есть опыт работы с Java, вы можете просто написать свой код на Java и вызвать его из MATLAB. Эта статья Techdoc должна помочь вам начать работу, если вы решите пойти по этому пути.Но, вероятно, было бы более полезно узнать, как это сделать в m-script (см. Ответ jomb87)

Кстати, вы могли бы улучшить производительность вашего алгоритма Java, если бы в дальнейшем использовали хеш-карту:1005 *

    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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...