2016-06-21 6 views
0

Это сообщение следует еще один пост: find common value of one matrix in another matrixозначают на основе максимального значения матрицы

Как я объяснил там, у меня есть одна матрица MyMatrix 2549x13double

несколько примеров строк из MyMatrix:

-7.80 -4.41 -0.08 2.51 6.31 6.95 4.97 2.91 0.66 -0.92 0.31 1.24 -0.07 
4.58 5.87 6.18 6.23 5.20 4.86 5.02 5.33 3.69 1.36 -0.54 0.28 -1.20 
-6.22 -3.77 1.18 2.85 -3.55 0.52 3.24 -7.77 -8.43 -9.81 -6.05 -5.88 -7.77 
-2.21 -3.21 -4.44 -3.58 -0.89 3.40 6.56 7.20 4.30 -0.77 -5.09 -3.18 0.43 

Я определил максимальное значение для каждой строки матрицы MyMatrix следующим образом:

[M Ind] = max (MyMatrix, [], 2); Пример линии ввода получить в М:

6.95 
6.23 
3.24 
7.20 

Теперь, я хотел бы выбрать в MyMatrix эти 2 значения до и после максимального значения, которые содержатся в М, так как мне нужно будет вычислить среднее значение этих 5 значений , Так, в примере, я хотел бы, чтобы выбрать:

2.51 6.31 6.95 4.97 2.91 
5.87 6.18 6.23 5.20 4.86 
-3.55 0.52 3.24 -7.77 -8.43 
3.40 6.56 7.20 4.30 -0.77 

и создать новый столбец в MyMatrix со средним значением этих 5 значений.

После кода по @Dan, взятый из предыдущего поста:

colInd = bsxfun(@plus,PeakInd, -2:2); 
MyMatrixT = MyMatrix.'; 
rowIndT = colInd.'; 
linIndT = bsxfun(@plus,rowIndT,0:size(MyMatrixT,1):size(MyMatrixT,1)*(size(MyMatrixT,2)-1)); 
resultT = MyMatrixT(linIndT); 
result = resultT.'; 
mean(result,2) 
MyMatrix = [MyMatrix, mean(result,2)]; 

Вот новая часть поста, что касается этого вопроса, когда максимальное значение вблизи краев. Когда максимум является первым или последним столбцом MyMatrix, я хотел бы получить NaN.

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

Хотя, когда максимум находится во втором последнем столбце, я хотел бы рассмотреть два столбца, предшествующие максимальному, максимальному значению и только одному столбцу, следующему максимуму.

Я был бы очень признателен, если бы вы могли мне помочь. Большое спасибо!

+0

Довольно уверен, что это что мой второй код, просто использует 'nanmean'. Поэтому, если ваш макс был в столбце 2, вы получите что-то вроде '[NaN, 6,10, 4, 2]', поэтому 'nanmean' даст вам среднее значение' [6,10,4,2] ', которое использует 1 колонку preeding и два столбца, следующих за max ... – Dan

+0

Единственное, что нужно добавить в комментарий @Dan, это то, что для получения «NaN», если ваш максимум находится в первом или последнем столбце, вам просто нужно его изменить конец.(Скажем, столбец, который вы собираетесь добавить, называется 'M2', а количество столбцов исходной матрицы было' N', вам нужно позвонить в 'M2 (Ind == 1 | Ind == N) = NaN; ') – BillBokeey

+0

@BillBokeey no Я имел в виду, что я уже полностью ответил на это здесь http://stackoverflow.com/a/37705364/1011724 – Dan

ответ

1

Вместо создания 2D массив с NaNs плюс nanmean, вы могли бы использовать min/max, чтобы получить правильные показатели:

pad = 2; 
[~, Ind] = max(MyMatrix, [], 2); 
minCol = max(1, Ind-pad); 
maxCol = min(size(MyMatrix, 2), Ind+pad); 
result = arrayfun(@(row, min_, max_) mean(MyMatrix(row, min_:max_)),... 
        (1:size(MyMatrix, 1)).', minCol, maxCol); 
0

Если у вас есть изображение Processing Toolbox, вы можете также использовать padarray, например,

B = padarray(magic(5),[0 2],NaN); 

B = 

    NaN NaN 17 24  1  8 15 NaN NaN 
    NaN NaN 23  5  7 14 16 NaN NaN 
    NaN NaN  4  6 13 20 22 NaN NaN 
    NaN NaN 10 12 19 21  3 NaN NaN 
    NaN NaN 11 18 25  2  9 NaN NaN 

(... если у вас нет padarray, просто вручную добавить 2 NaN столбцы с обеих сторон), а затем с помощью некоторых bsxfun + sub2ind мы получаем желаемый результат:

pad_sz = 2; 
B = padarray(magic(5),[0 pad_sz],NaN); 
[~,I] = nanmax(B,[],2); % by using nanmax we "explicitly" say we ignore NaNs. 
colInd = bsxfun(@plus,-pad_sz:pad_sz,I); 
linearInd = sub2ind(size(B), repmat((1:5).',[1,size(colInd,2)]), colInd); 
picks = B(linearInd); 
res = nanmean(picks,2); 
% or combine the last 3 lines into: 
% res = nanmean(B(sub2ind(size(B), repmat((1:5).',[1,size(colInd,2)]), colInd)),2); 
res = res + 0./~(I == pad_sz+1 | I == size(B,2)-pad_sz); %add NaN where needed. 
+0

Спасибо за ваш ответ. Тем не менее, я хочу, чтобы NaN был средним значением, только когда максимум находится в первом или последнем столбце (это нормально, если максимум находится во втором или втором последних столбцах). – dede

+0

@dede - см. Обновленный ответ. –

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