2015-03-29 2 views
0

У меня есть матрица данных для курса обработки естественного языка, и мне нужно, чтобы евклидова нормализовала матрицу, я очень новичок в R, поэтому не могу понять, что я делаю неправильно с моим кодом, Heres код:R Euclidean norm of Matrix

A=matrix(
c(1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,0,1,2,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,1), 
nrow=11, 
ncol=10) 
norm_vec <- function(x) sqrt(sum(x^2)) 
B=matrix(
nrow=11, 
ncol=10) 
for(n in 1:10) 
length <- norm_vec(A[,n]) 
for(j in 1:11) 
B[j,n]<- A[j,n]/length 

Для этого я получаю выход только последний столбец является правильным остальные столбцы являются NA, и я не понимаю, почему это так. Что я делаю не так?

+1

Почему "Matlab" тег? –

+1

@ LuisMendo - Это вздор. Я удаляю его. – rayryeng

+0

@rayryeng извините первый раз, используя stackoverflow, он дал это как автоматический тег, и я просто щелкнул по нему, так как коды схожи –

ответ

2

@ решение Sathish может идти полностью векторную

A/matrix(sqrt(colSums(A*A)), nrow=11, ncol=10, byrow=TRUE) 

#   [,1] [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10] 
#[1,] 0.5773503 0.0 0.0000000 0.4082483 0.5773503 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
#[2,] 0.5773503 0.5 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
#[3,] 0.5773503 0.5 0.5773503 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
#[4,] 0.0000000 0.5 0.0000000 0.4082483 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
#[5,] 0.0000000 0.5 0.0000000 0.8164966 0.5773503 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
#[6,] 0.0000000 0.0 0.5773503 0.0000000 0.5773503 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
#[7,] 0.0000000 0.0 0.5773503 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.7071068 
#[8,] 0.0000000 0.0 0.0000000 0.0000000 0.0000000 0.7071068 0.0000000 0.0000000 0.0000000 0.0000000 
#[9,] 0.0000000 0.0 0.0000000 0.0000000 0.0000000 0.7071068 0.7071068 0.5773503 0.7071068 0.0000000 
#[10,] 0.0000000 0.0 0.0000000 0.0000000 0.0000000 0.0000000 0.7071068 0.5773503 0.0000000 0.0000000 
#[11,] 0.0000000 0.0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.5773503 0.7071068 0.7071068 
+0

Большое спасибо, это именно то, что я искал –

0
A=matrix(c(1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,0,1,2,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,1), nrow=11, ncol=10) 

norm_vec <- function(x){ 
       sqrt(sum(x^2)) 
      } 

B=matrix(nrow=11, ncol=10) 

Euc.lenA <- c() 

for(n in 1:10){ 
    Euc.lenA <- c(Euc.lenA, norm_vec(A[,n])) 
} 

for(j in 1:10){ 
    B[,j]<- A[,j]/Euc.lenA[j] 
} 

Euc.lenA 
[1] 1.732051 2.000000 1.732051 2.449490 1.732051 1.414214 1.414214 1.732051 1.414214 1.414214 

A and B

+0

@Furkan Eris: дайте мне знать, если это то, что вам нужно от этого поста. – Sathish