2013-05-10 2 views
0

Я внимательно изучил Интернет для ответа на этот вопрос, но, похоже, он слишком специфичен для ответа в другом месте. Это моя последняя остановка.Каков правильный способ реализации этого цикла, который будет иметь средние значения с изменяющимся счетчиком?

Чтобы предварить это не проблема домашних заданий, но является адаптировано из онлайн-курс Coursera, чей тест уже прошел. Я получил правильный ответ, но это была большая удача. Кроме того, это более общий вопрос программирования, чем что-либо, связанное с курсом, поэтому я знаю, что в моем праве просить об этом на открытом форуме.

Последнее, что я пытаюсь сделать это в MatLab; однако, если у вас есть ответ на C++ или Python или любой другой язык высокого уровня, это было бы замечательно, поскольку я мог бы легко адаптировать эти решения к синтаксису MatLab.

Здесь:

У меня есть два вектора, T и M, каждый из которых 600000 элементов/записи/целых чисел.

T вводится как миллисекунды от 1 до 600 000 в порядке возрастания, и каждый элемент в M представляет «on» или «off» (вводится как 1 или 0 соответственно) для каждой соответствующей миллисекундной записи в T. Таким образом, существуют случайные 1 и 0 в M, которые соответствуют определенной миллисекунде от 1 до 600 000 в T.

Мне нужно взять, начиная с 150-й миллисекунды T, и с шагом в 150 элементов/миллисекундах оттуда (включительно), среднее значение миллисекунды этих групп 150, но ТОЛЬКО тех миллисекунд, чьи записи равны 1 в M ('on'). Например, мне нужно посмотреть первые 150 миллисекунд в T, посмотреть, какие из них имеют значение 1 в M, а затем усредняют их. Затем мне нужно сделать это снова с вводами от 151 до 300 в T, затем от 301 до 450 и т. Д. Эти новые средние значения также должны быть сохранены в новом векторе. Проблема в том, что число соответствующих 1 в M не будет одинаковым для каждой группы из 150 миллисекунд в T. (И да, мы пытаемся усреднить фактическое значение миллисекунд, поэтому значения, которые мы используем в среднем и порядок записей в T будет одинаковым).

Моей попытка:

Оказывается, есть только 53583 случайные 1-й в М (из 600.000 записей, остальные равно 0). Я использовал оператор «найти» для извлечения тех записей из M, которые являются 1 в новый вектор K, который имеет миллисекундное значение, соответствующее T. Таким образом, K выглядит как пучок случайных чисел в порядке возрастания, что является просто списком все миллисекунды в T, которые «включены» (назначены 1 в M).

Так что K выглядит примерно как [2 5 11 27 39 40 79 ...... 599,698 599,727 и т. Д.] (Все миллисекунды, которые являются 1 в М).

Итак, у меня есть вектор K, который является всеми значениями, которые мне нужно усреднять по группам из 150, но проблема в том, что мне нужно идти группами по 150 на основе вектора T (от 1 до 600 000), это означает, что не всегда будет одинаковое количество 1 (или значений в K) в каждой группе из 150 миллисекунд в T, что, в свою очередь, означает, что число, которое мне нужно разделить, чтобы получить среднее значение для каждой группы, изменится для каждой группы из 150. Я знаю, что мне нужно использовать цикл, чтобы выполнить среднее значение миллисекунды для каждых 150 записей, но как мне получить разделительный номер (количество записей для каждой группы из 150 человек, которым присваивается 1 или on ') для изменения на каждой итерации цикла? Есть ли способ связать T и M вместе, чтобы они использовали только требуемые значения из K, когда есть 1 в M, а затем просто используйте простой счетчик для среднего?

Это не сложная проблема, но ее очень сложно объяснить. Извини за это!Надеюсь, я объяснил так ясно, как только мог. Любая помощь будет оценена, хотя я уверен, что у вас будут вопросы в первую очередь.

спасибо!

ответ

0

Я думаю, что это должно работать нормально.

sz = length(T); 
n = sz/150; 
K = T.*M'; 

t = 1; 
aver = zeros(n-1,1); % Your result vector 

for i = 1:150:sz-150 
    aver(t) = mean(K(i:(i+150)-1)); 
    t = t + 1; 
end 

Роб

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

  • Нет связанных вопросов^_^