2016-02-26 2 views
0

Я только что выполнил SVD по моим данным (M = UDV^t), и у меня есть 3 svd-матрицы U, D, Vt. Эти матрицы сортируются по наивысшему сингулярному значению D (что означает, что первый столбец U и первая строка V соответствуют наивысшему сингулярному значению и т. д.)Переупорядочить строки матрицы по пользовательскому сортировке

Я хочу поменять этот порядок в соответствии с конкретными критериями сортировки: меня не интересует сортировка по абсолютной исключительной величине но скорее сингулярное значение ди умножается на первый элемент его соответствующего вектора в Vt

Пример (псевдо-код, R-код ниже):

Singular_values = [ sV[1]=100, sV[2]=1, sv[3]=50 ] 

Dt = [ 
    0.1, xxx, ... # 1st row Dt1 associated to 1st singular Value 
    100, yyy, ... # 2nd row Dt2 associated to 2nd singular Value 
    1 , zzz, ... # 
] 

Продукты, sV[i]*Dti[1] отдавания:

100*0.1 = 10, # sV1*Dt1[1] 
1*100 = 100, # sV2*Dt2[1] 
50*1 = 50  # sv3*Dt3[1] 

Какой должна быть заказана по убыванию [1,2,3]> [2,3,1]

100 # sV2*Dt2[1] 
50 # sv3*Dt3[1] 
10 # sV1*Dt1[1] 

... и распространять эти изменения Матричное Dt

Dt_reordered [ 
    100, yyy, ... # 2nd row Dt2 associated to 2nd singular Value 
    1, zzz, ... # 3rd row Dt3 associated to 3rd singular Value 
    0.1, xxx, ... # 
] 

R Код

dataToSVD = matrix(rexp(200), 10) 
theSVD = svd(dataToSVD) # Generates ... 
# theSVD$u (Matrix U : I don't care about this one), 
# theSVD$d (List D : singularValues), 
# theSVD$v (Matrix V : Right singular vectors, not transposed) 

theSVD$newValues <- theSVD$d*theSVD$v[1,] # This is a list of the "new" values that should be used for sorting 
# The idea is now to sort theSVD$newValues by decreasing values, and the corresponding permutation must be applied also to theSVD$d and theSVD$v[1,] 
+0

Это не выглядит как R код. Вы используете какой-нибудь псевдокод? Это поможет сделать [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – MrFlick

+0

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

ответ

0

Это сортирует матрицу вы можете легко найти это на Google поиск по
г сортировки матрицы

взглянуть here

+0

Спасибо. В моем случае речь шла только о том, где поместить запятую 'SSDD_SVD $ sort_rs <- theSVD $ d * (theSVD $ v [1,]); theSVD $ v_r <- theSVD $ v [, order (theSVD $ sortOrder, убывающий = TRUE)] ' ' –