2013-11-14 5 views
0

У меня есть массив ячеек следующего типа:MATLAB: Непредвиденные Таблица

datABC = 
      [45] [67] 'A' 
      [34] [44] 'A' 
      [11] [84] 'A' 
      [23] [68] 'A' 
      [34] [44] 'B' 
      [30] [94] 'B' 
      [304] [414] 'C' 
      [78] [110] 'C' 
      [34] [120] 'C' 

Теперь я должен рассчитать количество наблюдений и среднего первого и второго столбца в соответствии с A, B & C.

Заранее спасибо.

+5

Должен сдерживать себя ... делать ... нет ... сообщение ... ответ. – chappjc

+0

подсказка ... cellfun - это один из способов сделать это –

+0

Это, вероятно, поможет вам: http://stackoverflow.com/questions/8061344/how-to-search-for-a-string-in-cell-array- in-matlab – Daniel

ответ

1

Получите удовольствие от logical indexing.

for x = unique(datABC(:,3))' 
    idx = strcmp(x, datABC(:, 3)); 
    disp([x{1} ': ' num2str(sum(idx)) ' observations']) 
    disp(mean(cell2mat(datABC(idx, 1:2)))) 
end 
2

Видя, как открываются шлюзы, я мог бы также выбросить свои два цента.

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

stringKeys = unique(datABC(:,3))' 

Затем вы можете использовать anonymous function и cellfun для подсчета вхождений каждого ключа:

memberFun = @(x) ismember(datABC(:,3),x); 
keyOccurrences = cellfun(@(x) nnz(memberFun(x)),stringKeys) 

Чтобы вычислить среднее соответствующие данные для каждого из первых двух столбцов, вы можете снова использовать cellfun с неоднородными выходами:

colMeanFun = @(x) mean(reshape([datABC{memberFun(x),1:2}],[],2),1); 
colMeans = cellfun(colMeanFun,stringKeys,'UniformOutput',false); 
colMeans = vertcat(colMeans{:}) 

Также посмотрите strcmpmi, который можно использовать вместо ismember, но проигнорирует регистр.

Тестовые данные:

datABC = {[45] [67] 'A'; [34] [44] 'A'; [11] [84] 'A'; ... 
      [23] [68] 'A'; [34] [44] 'B'; [30] [94] 'B'; ... 
      [304] [414] 'C'; [78] [110] 'C'; [34] [120] 'C'}; % 9-by-3 
+0

+1 для _avoiding_ 'accumarray' ;-) –

2

выглядит как работа для accumarray:

[categories ii jj] = unique(dataABC(:,3)); 
num = histc(jj,1:max(jj)); 
mean1 = accumarray(jj, cell2mat(dataABC(:,1)), [], @mean); 
mean2 = accumarray(jj, cell2mat(dataABC(:,2)), [], @mean); 

Пример:

>> dataABC{4,2} 

dataABC = 

    [1] [10] 'A' 
    [2] [-5] 'B' 
    [3] [15] 'A' 
    [4] [40] 'CC' 

дает

categories = 

    'A' 
    'B' 
    'CC' 

>> num 

num = 

    2 
    1 
    1 

>> mean1 

mean1 = 

    2 
    2 
    4 

>> mean2 

mean2 = 

    12.5000 
    -5.0000 
    40.0000 
+0

Поистине, нет проблем, которые' tankarray' не может решить. – chappjc

+0

@chappjc Я не мог сдержать, как вы! –

+0

@chappjc Эй, в конце концов, вы тоже этого не сделали! –

Смежные вопросы