Как мне выполнить это объединение и усреднение в MATLAB?

Я пытаюсь выполнить среднее значение биннинга. Я использую код:

Avg = mean(reshape(a,300,144,27));
AvgF = squeeze(Avg);

Последняя строка избавляется от одноэлементных размеров.

Итак, как видно, я набираю в среднем более 300 баллов. Он работает нормально, за исключением случаев, когда у меня общее количество точек не равно кратному 144 * 300.

Есть ли способ заставить это среднее биннинга работать, даже если общее количество баллов не кратно 144 * 300?

EDIT: Извините, если мой вопрос звучит запутанно. Чтобы уточнить...

У меня есть файл с 43200 строк и 27 столбцов. Я усредняю, объединяя по 300 строк за раз, что означает, что в итоге у меня остается матрица размером 144 на 27.

Мой код, как я написал выше, работает только тогда, когда у меня ровно 43200 строк. В некоторых случаях у меня есть 43199, 43194 и т. д. Функция изменения формы работает, когда у меня есть общее количество строк, кратное 300 (размер ячейки). Есть ли способ заставить это среднее значение биннинга работать, когда общее количество строк не кратно 300?


person AP.    schedule 24.11.2009    source источник
comment
Не зная, как выглядят данные, одна из идей состоит в том, чтобы дополнить ваш массив NaN, чтобы достичь желаемого размера, и использовать nanmean, который аналогичен mean, только игнорируя значения NaN.   -  person Amro    schedule 24.11.2009
comment
На сколько очков вам не хватит? Один или два? Сотни? Тысячи?   -  person gnovice    schedule 24.11.2009
comment
в одних файлах у меня 86399, в других 86395 и так далее, по сравнению с 86400, что мне и нужно на весь день. как я написал, это работает, если я удалю больше точек, чтобы сделать его равным 143 * 300, но мне нужно вручную проверить и стереть точки. поэтому мне было интересно, есть ли способ сделать это   -  person AP.    schedule 24.11.2009
comment
Если ваше общее количество баллов составляет 86 400, разве 27 в вашем коде не должно быть 2?   -  person gnovice    schedule 24.11.2009
comment
нет, должно быть 27, так как у меня 27 столбцов в файле   -  person AP.    schedule 24.11.2009
comment
600 (а не 300, как я писал выше) — это количество точек в моей корзине. и когда я убираю на 300 баллов, у меня остается 144 общих балла 43200 баллов   -  person AP.    schedule 24.11.2009


Ответы (1)


Кажется, теперь я лучше понимаю проблему...

Если a — это данные, считанные из вашего файла (размером N на 27, где N в идеале составляет 43 200), то я думаю, вы захотите сделать следующее:

nRemove = rem(size(a,1),300);  %# Find the number of points to remove
a = a(1:end-nRemove,:);        %# Trim points to make an even multiple of 300
Avg = mean(reshape(a,300,[],27));
AvgF = squeeze(Avg);

Это удалит точки, так что количество строк в a будет кратно 300. Тогда ваше изменение формы и среднее значение должны работать. Обратите внимание, что я использую [] в вызове RESHAPE. , что позволяет определить, каким должен быть номер столбца.

person gnovice    schedule 24.11.2009
comment
@AP: Я думаю, кто-то, должно быть, проголосовал за вас, так как первая версия была немного неясной. Самая новая версия имеет больше смысла, так что, возможно, они снимут свой отрицательный голос. - person gnovice; 24.11.2009