Как выполнить усреднение по массиву ячеек? - PullRequest
8 голосов
/ 04 марта 2011

У меня есть массив ячеек c массивов одинакового размера, т. Е. size(c{n}) = [ m l ... ] для любого n.Как я могу получить значения mean (усреднение по индексу массива ячеек n) для всех элементов массива за один цикл?Я думал об использовании cell2mat и mean, но первое не добавляет другое измерение, а меняет l на l*n.И зацикливание вручную, конечно, длится вечно ...

Ответы [ 6 ]

16 голосов
/ 04 марта 2011

Если все ваши массивы имеют одинаковый размер, имеет смысл хранить их в матрице, а не в массиве ячеек. Это облегчает выполнение операций над ними, например, получение среднего значения. Вы можете преобразовать ваши данные в матрицу, используя функции NDIMS и CAT :

dim = ndims(c{1});          %# Get the number of dimensions for your arrays
M = cat(dim+1,c{:});        %# Convert to a (dim+1)-dimensional matrix
meanArray = mean(M,dim+1);  %# Get the mean across arrays
5 голосов
/ 10 сентября 2012

Если у вас более высокая версия matlab, это можно сделать с помощью функции 'cellfun'.Это может обработать клетки с неравным размером массива.

C = {1:10, [2; 4; 6], []};
Cmeans = cellfun(@mean, C)
Cmeans =
    5.5000    4.0000       NaN

Ссылка: https://groups.google.com/forum/?fromgroups=#!topic/comp.soft-sys.matlab/S_hyHxy11f0

2 голосов
/ 06 ноября 2013

Я нашел простой способ найти средние значения в массиве Cell по следующей ссылке: http://www.gomatlab.de/cellfun-t25114.html

Может x быть ячейкой.Тогда:

var_mean = cellfun(@mean, x, 'UniformOutput', false); %columnwise mean value


var_mean = cellfun(@(in) mean(in(:)), x); %% mean value of the total "subcell"
2 голосов
/ 04 марта 2011

Вы на правильном пути. Используйте CELL2MAT , чтобы преобразовать массив ячеек в числовой массив, а затем RESHAPE , чтобы построить трехмерную матрицу. Затем вы можете вычислить среднее значение с помощью функции MEAN с аргументом измерения:

>> c = {[1 2 3; 4 5 6] [7 8 9; 12 13 14]}

c = 

    [2x3 double]    [2x3 double]

>> mean(reshape(cell2mat(c), [2, 3, 2]), 3)

ans =

     4     5     6
     8     9    10
1 голос
/ 04 марта 2011

Это просто проходит через ячейку и означает массив, пока он не станет одиночным. Это не займет много времени, это означает 40 миллионов операций с плавающей запятой, занимает 1 секунду.

function n = big_mean
tic
c = cell(1000);

for ii = 1:length(c)
    c{ii} = rand(8,7,6,5,4,3,2);
end

n = all_cells(c);
toc
end

function n = all_cells(c)

n = zeros(length(c),1);
for ii = 1:length(c)
    n(ii) = cell_mean(c{ii});
end

n = mean(n);
end

function n = cell_mean(n)

while length(size(n))~=2
    n = mean(n);
end

end

Elapsed time is 1.042459 seconds.

ans =

    0.4999
0 голосов
/ 20 февраля 2014

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

a=0;
MyCellAddFun=@(Input) a*eye(size(Input))+Input;
temp=arrayfun(@(ind) MyCellAddFun(CellData{ind}),1:length(CellData),'uniformoutput',false);
answer=temp{end}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...