[R] Construct a lower-triangular matrix

Berend Hasselman bhh at xs4all.nl
Sat Oct 10 14:48:29 CEST 2015


> On 10 Oct 2015, at 13:39, peter dalgaard <pdalgd at gmail.com> wrote:
> 
>> 
>> On 10 Oct 2015, at 10:49 , Berend Hasselman <bhh at xs4all.nl> wrote:
>> 
>>> 
>>> On 10 Oct 2015, at 10:00, David Winsemius <dwinsemius at comcast.net> wrote:
>>> 
>>> 
>>> On Oct 9, 2015, at 10:57 PM, Steven Yen wrote:
>>> 
>>>> Dear
>>>> How do you construct a lower triangular matrix from a vector.
>>>> 
>>>> I want to make vector
>>>> 
>>>> a <- 1:10
>>>> 
>>>> into a triangular matrix
>>>> 
>>>> 1 0 0  0
>>>> 2 3 0  0
>>>> 4 5 6  0
>>>> 7 8 9 10
>>>> 
>>> 
>>> I'm not sure this method with logical indexing will be the most elegant:
>>> 
>>> ?lower.tri
>>> ?col
>>> 
>>>> b=matrix(0, sqrt(10)+1,sqrt(10)+1)
>>> 
>>>> b[lower.tri(b)| row(b)==col(b)] <- 1:10
>>>> b
>>>   [,1] [,2] [,3] [,4]
>>> [1,]    1    0    0    0
>>> [2,]    2    5    0    0
>>> [3,]    3    6    8    0
>>> [4,]    4    7    9   10
>>> 
>> 
>> That doesn’t seem to be what the OP wanted.
>> 
>> This should do it.
>> 
>> a <- 1:10
>> C <- matrix(0, sqrt(length(a))+1,sqrt(length(a))+1)
>> i.upr <- which(upper.tri(C, diag = TRUE), arr.ind=TRUE)
>> C[i.upr] <- a
>> t(C)
>> 
>> resulting in
>> 
>>    [,1] [,2] [,3] [,4]
>> [1,]    1    0    0    0
>> [2,]    2    3    0    0
>> [3,]    4    5    6    0
>> [4,]    7    8    9   10
>> 
>> I found this here: http://stackoverflow.com/questions/24472060/indexing-upper-or-lower-triangle-in-matrix-with-diagonal
> 
> It's crossing the creek a couple of times too many, though. This'll do:
> 
>> M <- matrix(0,4,4)
>> M[upper.tri(M,TRUE)] <- 1:10 
>> t(M)
>     [,1] [,2] [,3] [,4]
> [1,]    1    0    0    0
> [2,]    2    3    0    0
> [3,]    4    5    6    0
> [4,]    7    8    9   10
> 
> I'm also not buying the sqrt(length(a))+1 bit --- floor(2*length(a)) is more like it.
> 

Shouldn’t that be

m <- sqrt(floor(2*length(a)))
M <- matrix(0,m,m)

for the general case?

Berend



More information about the R-help mailing list