2017-01-25 1 views
0

У меня есть простая примерная матрица следующим образом: (Фактическая матрица, над которой я работаю, составляет 674x11 и не просто все элементы «1»).Создание кумулятивной матрицы, которая учитывает начальные точки столбца

a = 

    1 1 1 NaN NaN 
    1 1 1 NaN NaN 
    1 1 1 1 NaN 
    1 1 1 1 1 
    1 1 1 1 1 

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

Таким образом, вместо:

cumsum(a)= 

    1 1 1 NaN NaN 
    2 2 2 NaN NaN 
    3 3 3 1 NaN 
    4 4 4 2 1 
    5 5 5 3 2 

, что я хочу достичь, это:

cumsum(a) = 

    1 1 1 NaN NaN 
    2 2 2 2 NaN 
    3 3 3 3 3 
    4 4 4 4 4 
    5 5 5 5 5 

где элемент (2,4) является среднее A (2,1: 3) и элемент (3,5) - среднее значение a (3,1: 4).

+0

Вы хотите заменить * все значения 'NaN' на выходе? – Suever

+0

В вашем примере есть проблема. Разве это не должно быть «элемент (2,4) - это среднее значение cumsum (a) (2,1: 3)»? – rahnema1

+0

На самом деле, размышляя над проблемой, вы правы. Элементом (2,4) должно быть среднее значение cumsum (a) (2,1: 3). –

ответ

1

Вы можете вычислить среднее значение для каждой строки (игнорируя значения NaN), используя nanmean. Затем мы можем использовать find, чтобы идентифицировать строку, в которой каждый NaN, и заменить значения на среднее значение этой строки. Тогда мы можем следовать, что до с cumsum операциями

% Get the rows of each NaN value 
bool = isnan(a); 
[row,col] = find(bool); 

% Compute the mean value of each row 
rowmeans = nanmean(a, 2); 

% Replace the NaN values with their row means 
a(bool) = rowmeans(row); 

% Perform the cumulative sum 
result = cumsum(a); 

Если вы хотите оставить начальное NaN значения в качестве NaN значений после этого, то вы можете следить за ним с

result(bool) = NaN; 
+0

Работает отлично! Огромное спасибо! –

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