2014-09-14 2 views
2

Я делаю несколько PCA ядра и хочу разрешить матрицу. Я сделал все на Python и теперь хочу преобразовать свой код в matlab для сравнения.Смещение матрицы ядра/подобия в matlab

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

import numpy as np 
print('Sparsify a matrix by zeroing all elements but the top 2 values in a row.\n') 

A = np.array([[1,2,3,4,5],[9,8,6,4,5],[3,1,7,8,9]]) 

print('Before:\n%s\n' %A) 

for row in A: 
    sort_idx = np.argsort(row)[::-1] # get indexes of sort order (high to low) 
    for i in sort_idx[2:]: 
     row[i]=0 

print('After:\n%s\n' %A) 


Sparsify a matrix by zeroing all elements but the top 2 values in a row. 

Before: 
[[1 2 3 4 5] 
[9 8 6 4 5] 
[3 1 7 8 9]] 

After: 
[[0 0 0 4 5] 
[9 8 0 0 0] 
[0 0 0 8 9]] 

Итак, как бы я это сделать в MATLAB?

Было бы здорово, если бы вы могли помочь мне здесь. Существует ли эквивалент argsort, то есть получение, например, 3 самых низких значений в строке, чтобы я мог установить их в 0?

ответ

2

Один подход -

[m,n] = size(A); %// get size 
[~,col_ind]= sort(A,2,'descend') %// sort the rows in descending order 
A(bsxfun(@plus,(col_ind(:,3:end)-1)*m,[1:m]'))=0 %// get all indices other than 
      %// for top 2 values in each row and set those in A to zero 

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

Пример запуска -

A (Before) = 
    1  2  3  4  5 
    9  8  6  4  5 
    3  1  7  8  9 
    5  6  2  6  7 

A (After) = 
    0  0  0  4  5 
    9  8  0  0  0 
    0  0  0  8  9 
    0  6  0  0  7 
+0

Большое спасибо. Заметка о «... первом совпадении максимального и второго максимума ...» - это важно знать, но для моего приложения это не имеет особого значения, так как у меня есть «реальные» значения (float) – Sebastian

+0

@SebastianRaschka Я вижу , удивительно! – Divakar

+1

+1 Так я тоже это сделаю –