矩阵的 R 欧几里德范数

R Euclidean norm of a Matrix

我有一个自然语言处理课程的数据矩阵,我需要对矩阵进行欧几里德归一化,我对 R 很陌生,所以我不知道我的代码做错了什么,这是代码:

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,我不明白为什么会这样。我做错了什么?

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

@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