2013-04-16 2 views
0

У меня есть матрицу 21128x9 в следующем формате:В MATLAB, как вычислить время, прошедшее между строк в матрице

x = ['Participant No.' 'yyyy' 'mm' 'dd' 'HH' 'MM' 'SS' 'question No.' 'response'] 

например

x = 

    Columns 1 through 5 

     18  2011   10   26   15 
     18  2011   10   26   15 
     18  2011   10   26   15 
     18  2011   10   26   15 
     18  2011   10   26   15 
     19  2011   10   31   13 
     19  2011   10   31   13 
     19  2011   10   31   13 
     19  2011   10   31   13 
     19  2011   10   31   13 

    Columns 6 through 9 

     42   33   27   4 
     42   39   17   2 
     42   45   52   2 
     42   47   45   3 
     42   50   12   3 
     6   5   36   1 
     6   20   27   4 
     6   22   34   5 
     6   33   43   3 
     6   42   42   1 

где столбцы 2-7 - векторы даты. Данные сортируются по дате/времени.

Я хотел бы рассчитать время, затрачиваемое на ответ на каждый вопрос для каждого участника, то есть время, прошедшее между строками 1 и 2, 2 и 3, 3 и 4, 4 и 5, а затем 6 и 7, 7 и 8 и т. д. - чтобы получить матрицу, отсортированную по номеру участника, где я затем смогу выработать среднее время, затраченное на вопрос.

Я пробовал использовать функцию etime, но безрезультатно.

EDIT: Что касается etime, просто чтобы увидеть, если она будет работать на практике, я попытался написать:

etime(x(2,5:7),x(1,5:7)) 

сравнить только столбцы 5-7 строк 1 и 2, но я продолжать получать обратно:

??? Index exceeds matrix dimensions. 

    Error in ==> etime at 41 
    t = 86400*(datenummx(t1(:,1:3)) - datenummx(t0(:,1:3))) + ... 
+0

сообщение ваш код для 'etime', я уверен, что кто-то может указать вашу ошибку – Dan

+0

Dan. Я добавил его к основному вопросу, но я сомневаюсь, что я на правильном пути с * etime *. – 8eastFromThe3ast

ответ

2

Вы были почти там! Вам нужно было изменить 5s на 2s, что все:

etime(x(2,2:7),x(1,2:7)) 

Теперь, чтобы получить их все позволяет сделать две матрицы финиковых векторов, но одна строка из синхронизации друг с другом:

Fisrt настроить х :

x =[ 18  2011   10   26   15  42   33   27   4 
     18  2011   10   26   15  42   39   17   2 
     18  2011   10   26   15  42   45   52   2 
     18  2011   10   26   15  42   47   45   3 
     18  2011   10   26   15  42   50   12   3 
     19  2011   10   31   13   6   5   36   1 
     19  2011   10   31   13   6   20   27   4 
     19  2011   10   31   13   6   22   34   5 
     19  2011   10   31   13   6   33   43   3 
     19  2011   10   31   13   6   42   42   1] 

Теперь распакуйте раз:

Tn = x(1:end-1, 2:7); 
Tnplus1 = x(2:end, 2:7); 

И ни один, чтобы получить вектор разности я п секунд между последовательными строками:

etime(Tnplus1, Tn) 

что приводит:

ans = 

      6 
      6 
      2 
      3 
     422595 
      15 
      2 
      11 
      9 

Кроме того, если вы не заботитесь о дневных данных год месяц просто установить их на нулевой т.е.

Tn(:, 1:3) = 0; 
Tnplus1(:, 1:3) = 0; 
etime(Tnplus1, Tn) 

ans = 

     6 
     6 
     2 
     3 
    -9405 
     15 
     2 
     11 
     9 
+1

О, я вижу! поэтому etime требует полного yyyy-mm-dd HH: MM: формат даты SS? – 8eastFromThe3ast

+0

Кроме того, можно ли получить эти данные в матрице со столбцом 1 из (x)? Итак, соберите «время, прошедшее» по номеру Участника? – 8eastFromThe3ast

+0

Да, просто соедините его. '[x (2: конец, 1) etime (Tnplus1, Tn)]' – Dan

1

Вот несколько простых шагов:

  • Вычислить DIF Ференц между двумя рядами, которые вы хотите сравнить
  • Multiply с вектором, который содержит количество секунд на единицу

Узкомасштабного пример:

% Hours Mins Secs: 

difference = ([23 12 4] - [23 11 59]); 
secvec = difference .* [3600 60 1]; 
secdiff = sum(secvec) 
+0

Спасибо Деннис, я понимаю простые шаги для отдельных вычислений. Мне интересно, есть ли способ заставить Matlab выполнять математику в течение времени, прошедшего в каждой из строк, где значение в столбце 1 одинаково. – 8eastFromThe3ast

+0

Вы можете легко вычесть столбец 1 из каждого столбца, используя 'bsxfun'. Такую же функцию можно использовать для умножения вашей матрицы на 'secvec'. –

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