2016-11-15 7 views
3

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

Один из матрицы столбца (назовем его T) - это непериодическое множество уникальных целых чисел, отсортированных в порядке возрастания. T можно моделировать:

T=sort(randperm(10E6,100)) ; 
T=T'; 

другой матрицы столбца (назовем его C) имеет значение 0 или 1, и обозначает состояние соответствующей строки в T в последующей операции. -Гораздо менее вероятно, чем 1. C можно моделировать:

C=ones(100,1); 
C(randperm(100,10))=0; 

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

Мы проходим через каждый ряд C. Если элемент в C имеет значение 0, то соответствующее значение строки в T будет вычтено из всех последующих значений в каждой строке T, пока мы не достигнем другого 0 в C.

Теперь я пытаюсь прорисовать следующую операцию, чтобы увеличить скорость при работе с несколькими миллионами матриц элементов.

lastReset = 0; 
newT = NaN*zeros(length(T),1); 
for index = 1:length(C) 
    if C(index) == 0 
     lastReset = T(index); 
    else 
     newT(index) = T(index) - lastReset; 
    end 
end 
newT(C==0)=[]; 

Как можно прорисовать вышеописанную петлю for?

+0

В чем ваш вопрос? – saygins

+0

Дорогой saygins, извините, я не включил вопрос. Теперь я редактировал сообщение с указанием моего запроса. Спасибо. –

ответ

1

Часто ключ командной с «работает» операции, как этот, является индексировать массив с выходом cumsum:

inds = (C == 0); 
subT = [0; T(inds)];  
newT = T - subT(cumsum(inds)+1); 
newT(inds) = []; 

Но, по крайней мере, на R2010a (да, старый), это на самом деле медленнее, чем ваша петля для больших N, и только незначительно быстрее для меньшего N.

Это гораздо труднее понять.