2013-07-11 4 views
3

У меня есть проблема, которую я надеюсь, что вкладчики могут помочь мне решить. Я думаю, что лучше всего привести рабочий пример:Средние значения в одном файле, основанные на значениях в другом

У меня есть две ячейки, каждая из которых состоит из одного и того же числа матриц (результат чтения ряда файлов данных, за которыми следуют некоторые вычисления цикла). Каждая матрица представляет собой столбец десятичных дней года, за которым следует серия столбцов данных. Вот фиктивные данные:

A = [ 186.356 1 2 3 4;186.364 2 3 4 5;186.372 3 4 5 6] 
B = [ 187.356 1 2 3 4;187.364 2 3 4 5;187.372 3 4 5 6] 
C = [ 188.356 1 2 3 4;188.364 2 3 4 5;188.372 3 4 5 6] 
x = {A,B,C} 
D = [ 186.3568 1 2 3 4; 186.3576 2 3 4 5; 186.3584 3 4 5 6; 186.3592 4 5 6 7; 186.36 5 6 7 8; 186.3608 6 7 8 9; 186.3616 7 8 9 10; 186.3624 8 9 10 11; 186.3632 9 10 11 12; 186.364 10 11 12 13; 186.3648 11 12 13 14; 186.3656 12 13 14 15] 
E = [ 187.3568 1 2 3 4; 187.3576 2 3 4 5; 187.3584 3 4 5 6; 187.3592 4 5 6 7; 187.36 5 6 7 8; 187.3608 6 7 8 9; 187.3616 7 8 9 10; 187.3624 8 9 10 11; 187.3632 9 10 11 12; 187.364 10 11 12 13; 187.3648 11 12 13 14; 187.3656 12 13 14 15] 
F = [ 188.3568 1 2 3 4; 188.3576 2 3 4 5; 188.3584 3 4 5 6; 188.3592 4 5 6 7; 188.36 5 6 7 8; 188.3608 6 7 8 9; 188.3616 7 8 9 10; 188.3624 8 9 10 11; 188.3632 9 10 11 12; 188.364 10 11 12 13; 188.3648 11 12 13 14; 188.3656 12 13 14 15] 
y = {D,E,F} 

Мое намерение состоит в том, чтобы суммировать столбцы данных, содержащиеся как внутри x, так и y. Однако вы можете видеть, что разрешение данных в y намного больше, чем x, поэтому я хотел бы сначала усреднить данные по y на основе временных меток x.

В качестве примера первого периода времени, который соответствует между й и у соответствует строке 1 в матрице А, но только первые 10 строк в матрице D. Сумма первой строки в А составляет 10:

sumA = sum(A(1,2:end),2) 

и среднее значение первых 10 строк в D является

sumD = sum(mean(D(1:10,2:end)),2) 

в результате чего в общей сложности 38

Это простой пример; У меня много строк данных в двух больших ячейках. Я подозреваю, что мне нужно извлечь данные из ячеек, пропустить данные, переписывая их в другую ячейку тех же размеров, что и первые две ячейки, x и y, но я не понимаю, с чего начать. Любая помощь будет большой.

Редактировать

В поисках прояснить мою проблему, я понимаю, что я сделал ошибку в оригинальном вопросе. Это, несомненно, причина путаницы.

Все выше является правильным, однако сумма первых 10 рядов D:

sumD = sum(mean(D(1:10,2:end)),2) 
sumD = 

28 

фактически должны быть добавлены к сумме второго ряда в А:

sumA = sum(A(2,2:end),2) 
sumA = 

14 

Это происходит потому, все значения в строках 1-10 столбца 1 в матрице D больше, чем значение в строке 1 и столбце 1 матрицы A, но меньше или равно строке 2 и столбцу 2 матрицы A. Это может быть проще, если увеличить фиктивные данные в матрице D:

D = [ 186.3568 1 2 3 4; 186.3576 2 3 4 5; 186.3584 3 4 5 6; 186.3592 4 5 6 7; 186.36 5 6 7 8; 186.3608 6 7 8 9; 186.3616 7 8 9 10; 186.3624 8 9 10 11; 186.3632 9 10 11 12; 186.364 10 11 12 13; 186.3648 11 12 13 14; 186.3656 12 13 14 15; 186.3664 13 14 15 16; 186.3672 14 15 16 17; 186.368 15 16 17 18; 186.3688 16 17 18 19; 186.3696 17 18 19 20; 186.3704 18 19 20 21; 186.3712 19 20 21 22; 186.372 20 21 22 23] 

Теперь результатом будет вектор с двумя значениями. Первое значение будет 28 + 14, результат суммы второй строки в A (или sumA) и сумма среднего из первых 10 строк данных в матрице D (или sumD). Второе значение будет сумма третьего ряда в А, позволяет сказать sumA2:

sumA2 = sum(A(3,2:end),2) 
sumA2 = 

18 

и sumD2:

sumD2 = sum(mean(D(11:end,2:end)),2) 
sumD2 = 

68 
sumA2+sumD2 

ans = 

86 

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

x = 

[300x5 double] [300x5 double] [300x5 double] 
y = 

[2000x5 double] [2000x5 double] [2000x5 double] 

Я хотел бы, чтобы результат

z = 

[300x1 double] [300x1 double] [300x1 double] 

Я не уверен, что делает вещи более ясным, но позволяет видеть!

+1

Очень хорошо написанный вопрос, но ему нужно немного уточнить: как вы сопоставляли первую строку 'A' с первыми 10 строками' D'? Вы рассматриваете некоторый уровень толерантности? Если да, то? –

+0

Hi Roney, чтобы уточнить: первые 10 строк D выбраны исходя из того, что значение в первом столбце (десятичный день года) находится в диапазоне между первым и вторым значениями в первом столбце D (эквивалентный десятичный день этого набора данных). Надеюсь, теперь это имеет смысл. – user1912925

+0

Прошу прощения, но могли бы вы использовать значения для иллюстрации? Кроме того, было бы лучше, если бы вы отредактировали его в вопросе, а не комментировали его. –

ответ

2

Ну, если мне удалось правильно получить все ваши каверзные спецификации, вот код:

function z = foo(x, y) 
    z = x; 
    for i = 1:length(x) 
    z{i} = sum(z{i}(:, 2:end), 2); 
    dmin = 0; 
    for j = 1:size(x{i}, 1) 
     dmax = x{i}(j, 1); 
     t = y{i}(:, 1); 
     mask = t > dmin & t <= dmax; 
     if any(mask) 
     z{i}(j) = z{i}(j) + sum(median(y{i}(mask, 2:end)), 2); 
     end 
     dmin = dmax; 
    end 
    end 
end 

Для данного x и y от вопроса, ответ z меня z{1} == z{2} == z{3} и

>> z{1} 
ans = 
10 
42 
70 

Если я подменю D из раздела «Редактировать», я получаю z{1}(3) == 86, как вы утверждали.

Ничего особенного в коде. dmin и dmax удерживать текущий диапазон дат в зависимости от значения первого столбца матрицы от x (то есть A, B и т. Д.). Оператор if any(mask) необходим, чтобы избежать приема медианы из пустого массива, что приводит к вектору NaN, который завинчивает сумму.

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