2017-02-02 10 views
0

У меня есть большой массив данных (он может иметь тысячи и десятки тысяч значений). Эти данные являются результаты экспериментов, собранных в одном массиве:Разделите массив данных более эффективным способом Matlab

data = [2.204000000000000 
    2.202000000000000 
    2.206000000000000 
    2.201000000000000 
    ... 
    ] 

И у меня есть время массив t того же размера:

t = [1 2 3 ... 65 66 1 2 3 4 ... 72 73 1 2 3 ... 75]'; 

t Это время, когда были собраны данные. Так t = 1:66 - это первый эксперимент, а затем t значения снова начинается с 1 - это данные 2 эксперимента и т.д. Что я хочу сделать: разделите данные по конкретным промежутки времени:

t<=1 
1<t<=4 
4<t<=6 
t>6 

Я иду таким образом

part1 = []; part2 = []; part3 = []; part4 = []; 
for ii = 1: size(data,1) 
    if (t(ii)) <=1  % collect all data corresponds to t<=1 
     part1 = [part1; ii]; 
    elseif (t(ii) >1 && t(ii) <=4) 
     part2 = [part2; ii]; 
    elseif (t(ii) >4 && t(ii) <=6) 
     part3 = [part3; ii]; 
    else 
     part4 = [part4; ii]; 
    end 
end 
data1 = data(part1); 
data2 = data(part2); 
data3 = data(part3); 
data4 = data(part4); 

это отлично работает, но это медленно из-за:

  1. Я не могу заранее выделить part1 part2 part3 part4 - Я не знаю их размеров;
  2. Он использует for петлю.

Можем ли мы сделать это более элегантным и быстрым способом?


Теперь у меня есть идея использовать одну ячейку памяти вместо 4 разных. Теперь я использую part{1} part{2} ... part{4}. Поэтому я могу выделить его как part = cell(4,1);

ответ

3

Вы можете улучшить свой код, используя логическое индексирование.

Я настоятельно рекомендую вам прочитать следующие ссылки:


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

data1 = data(t <= 1); 
data2 = data((t > 1) && (t <= 4)); 
data3 = data((t > 4) && (t <= 6)); 
data4 = data(t > 6); 

Логическая индексация как светофор: Это позволяет элементы массива, которые имеют значение 1 продолжать останавливая те элементы, которые имеют значение 0.

Matlab очень эффективен в таких задачах.

+0

Ahhh На самом деле, я просто переусердствовал об этом :) Простое решение! Все мое недоразумение было из-за того, что я везде использовал массивы ячеек (заменил их на числовые массивы, о которых идет речь только для удобства чтения). Итак, это 't {1,1} (1: end)' и т. Д. Просто засоряет мои глаза, и я не вижу этого :) Спасибо! –

+1

@Mikhail_Sam Спасибо, что нашли время, чтобы предоставить упрощенную версию вашего кода. Да, как вы говорите, он немного менее запутан с числовыми массивами, чем с массивами ячеек, но он хорошо работает на обоих. Я обновил свой ответ более интересными ссылками, которые могут оказаться полезными. Ура! – codeaviator