2016-12-16 13 views
1

Я задал вопрос here о численном интегрировании на 2-й массив с фиксированной длиной. Теперь, если длина интегрирования не фиксирована? Для каждой ячейки в качестве отправной точки я хочу продолжать интеграцию, пока она не встретит ячейку со значением противоположного знака. Поэтому предположим, что в столбце снизу вверх это [1,2,5,4,-2,-3,2], если я сделаю интеграл для первого элемента, он будет интегрировать первые четыре элемента (все они положительные). Если я начну с пятого элемента, он просто интегрирует -2 и -3. Есть ли способы его векторизации или ускорения вместо использования цикла double for, чтобы сначала найти длину интеграции для каждой ячейки, а затем сделать интеграл?Эффективный способ выполнения численного интегрирования на 2d-массиве с переменной длиной интегрирования

Или упрощена проблема просто интегрировать положительные элементы: пример:

data = [ 
-2, -1, 4, -2,-1; 
1, 2, 3, 4, 5; 
5, -4, -3, 2, 5; 
3, -3, -9, 5, 7; 
2, -2, 7, -5, 1; 
2, 3, 1, -3, -3] 

integrated_data = [ 
0, 0, 7, 0, 0; 
13, 2, 3, 11, 18; 
12, 0, 0 7, 13; 
7, 0, 0, 5, 8; 
4, 0, 8, 0, 1; 
2, 3, 1, 0, 0] 
+1

добавьте пример, например, матрицы [5, 5] и ожидаемого выхода. – rahnema1

+1

Вы спрашиваете о Matlab или NumPy? – FTP

+0

Почему у вас есть 0 в левой верхней части встроенных_данных? Разве это не должно быть -2? – littleO

ответ

0

векторизации решение в MATLAB

data = [ 
-2, -1, 4, -2,-1; 
1, 2, 3, 4, 5; 
5, -4, -3, 2, 5; 
3, -3, -9, 5, 7; 
2, -2, 7, -5, 1; 
2, 3, 1, -3, -3]; 
data1 = [-ones(1,size(data,2)) ;flipud(data)] 
df = find([-1 ;diff((data1(:))>=0)] == 1)-1; 
data1(data1<0) =0; 
c1 = cumsum(data1(:)); 
data1(df) = data1(df) - [0 ;diff(c1(df))]; 
c2 = cumsum(data1(:)); 
c2(data1==0)=0; 

c2=reshape(c2,size(data1)); 
result = flipud(c2(2:end,:))