#k <- 2; # k=rank(A)として,上位k個の特異値のみを使って,US(V)tを掛け合わせる
print("SVD Start!!")
k <- qr(A)$rank; #ランク数に応じて最小二乗誤差を求める
#k <- 1;
print(k)
A <- read.delim("sample.txt",F);
#print(A);
R <- svd(A);
R$u %*% diag(R$d) %*% t(R$v);
U <- R$u;
#U1 <- U[,1:(ncol(U)-k),drop=F] # m × (n-k) の行列U1を生成
U1 <- U[,1:k,drop=F]
#print("print U");
S <- diag(R$d);
S1 <- S[1:k,1:k,drop=F] #rank(A)=k k × k の正方行列の作成
V <- R$v;
#V1 <- V[,1:(ncol(V)-k),drop=F] # m × (n-k) の行列U1を生成
V1 <- V[,1:k,drop=F]
old <- U %*% S %*% t(V);
new <- U1 %*% S1 %*% t(V1);
#print(old)
cat("\n")
#print(new)
write.table(new,"result.txt",row.names = F, col.names=F, quote=F)
write.table(old,"old.txt",row.names = F, col.names=F, quote=F)
最終更新:2007年11月07日 22:26