2015-06-11 21 views
8

mam wektor powiedziećwektor do górnej matrycy Triangle po wierszu w R

a = c(1,2,3,4,5,6) 

ja jak zorganizować je do elementów na górnej matrycy trójkąta (nie biorąc pod uwagę elementy przekątnej są wszystkie zerowe) według wiersza. Moim celem jest, aby uzyskać następującą macierz:

 [,1] [,2] [,3] [,4] 
[1,] 0 1 2 3 
[2,] 0 0 4 5 
[3,] 0 0 0 6 
[4,] 0 0 0 0 

ale następujący sposób mogę to zrobić jest zastąpienie ukośne elementy z tego wektora jednak przypisać wartości przez kolumnę. Na przykład,

b= matrix(0, 4, 4) 
b[upper.tri(b, diag=FALSE)]=a 

to daje mi następujący matrycę

[,1] [,2] [,3] [,4] 
[1,] 0 1 2 4 
[2,] 0 0 3 5 
[3,] 0 0 0 6 
[4,] 0 0 0 0 

Powodem jest to, że gdy R przypisać wartości do macierzy, domyślnie będzie przypisać je przez kolumnę. Zastanawiam się, czy istnieje prosty sposób na rozwiązanie mojego problemu bez pisania pętli for.

znalazłem podobnego stanowiska przed związane z moim problemem, ale to nie wyjaśnia wartości przypisać do górnej matrycy trójkąta przez rzędu:

creating a triangular matrix

Dzięki z góry!

Odpowiedz

10

Oto jedna opcja

b[lower.tri(b, diag=FALSE)] <- a 
b <- t(b) 
b 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 1 2 3 
# [2,] 0 0 4 5 
# [3,] 0 0 0 6 
# [4,] 0 0 0 0 

Alternatywnie, kolejność a wymagane i przypisać, że w prawym górnym trójkącie:

ut <- upper.tri(b, diag=FALSE) 
b[ut] <- a[order(row(ut)[ut], col(ut)[ut])] 
b 
    [,1] [,2] [,3] [,4] 
[1,] 0 1 2 3 
[2,] 0 0 4 5 
[3,] 0 0 0 6 
[4,] 0 0 0 0 
+0

Dziękuję bardzo! To bardzo pomocne! ! – Crystal

0

pamiętać, że aby wypełnić asymetryczną matrycę można najpierw wypełnić górną trójkąt za pośrednictwem kodu pokazanego powyżej, a następnie niżej z innym rodzajem wektora (brak potrzeby transpozycji c < - c (7,8,9,10,11,12) b [lower.tri (b, diag = FALSE) ] < - c