Как применить функцию к каждой ячейке в массиве ячеек, который содержит 3D Matrix в Matlab?

У меня есть массив ячеек, размерность сказать 1x8 и каждая клетка состоит из 10x13xNmatirx(числовые значения).

Пример:

10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double 10x13x91 double

Теперь я хочу взять среднее значение и дисперсию для 10x13(130 значений) по N., т. е. (1,1,1)(1,1,2)...(1,1,N). первые 2 значения указывают точки, а третье относится к позиции.

Когда я пытаюсь применить среднее значение для массива ячеек 1x8 того же размера и значений ячеек, как указано выше, используя cellfun функция, я получаю следующую ошибку.

A = 1x8 cell

B = cellfun(@mean,A)

Error using cellfun Non-scalar in Uniform output, at index 1, output 1. Set 'UniformOutput' to false.

мне нужны результаты, такие как только 260 значений (среднее + дисперсия) по 8 элементам 1x8 Cellarray, кстати, я могу игнорировать N значений, так как я беру среднее и дисперсию по N. Как я могу это сделать? Благодарю.

3 ответа

Решение

Вместо того, чтобы использовать @mean использовать @(x)mean(x,3) и как уже упоминали другие - ...,'UniformOutput',false,

Так как результаты вычислений всегда имеют одинаковый размер (10x13), вы можете преобразовать полученную ячейку в числовой массив, если вы reshapeB быть вектором в 3- м измерении:

C = cell2mat(reshape(B,1,1,[]));

Теперь, если вы также хотите вычислить дисперсию, вы можете сделать что-то вроде

B = cellfun(@(x)cat(3,mean(x,3),var(x,0,3)),A,'UniformOutput',false);

Но если вы хотите, чтобы последний B был числовым массивом, вам нужно сделать его вектором в 4- м измерении (поскольку 3- й был взят конкатенацией):

C = cell2mat(reshape(B,1,1,1,[]));

Выход из cellfun не то же самое в каждой клетке, поэтому вам нужно написать B = cellfun(@mean,A,'UniformOutput',false),

Я не уверен, что понимаю вопрос. Я думаю, что последовательность кода, которую вы хотите, это:

B = cellfun(@mean,A,'UniformOutput',false);
B = cellfun(@mean,B,'UniformOutput',false);
B = cellfun(@squeeze,B, 'UniformOutput', false);

результат здесь:

B =

1×8 cell array

{91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}    {91×1 double}

Я не уверен, каков контекст ваших данных, но при условии, что вы хотите найти одно значение дисперсии для всей матрицы 10x13, вам нужно будет сначала сгладить матрицу перед использованием функции var,

for ii=8:-1:1
    flatA{ii} = reshape(A{ii}, 130, 91);
end

V = cellfun(@var, flatA, 'UniformOutput', false);
V = cellfun(@squeeze, V, 'UniformOutput', false);
Другие вопросы по тегам