# Re: [R] almost lower triangular matrices

From: Spencer Graves <spencer.graves_at_pdf.com>
Date: Wed 02 Mar 2005 - 09:20:50 EST

Output from which program? If the output is of class "dist", then "as.matrix" should give you what you want:

``` > set.seed(1)
> X <- array(rnorm(12), dim=c(4,3))
> (dX <- dist(X))
1         2         3
2 1.6598683
3 0.9720025 2.4600033
```

4 2.2666735 2.2149274 2.6890545
> length(dX)
[1] 6
> as.matrix(dX)

1 2 3 4

```1 0.0000000 1.659868 0.9720025 2.266674
2 1.6598683 0.000000 2.4600033 2.214927
3 0.9720025 2.460003 0.0000000 2.689054
4 2.2666735 2.214927 2.6890545 0.000000
>
hope this helps.
spencer graves

```

Douglas Bates wrote:

>
>> I have output from a program which produces a distance matrix I want to
>> read into a clustering program in R.
>>
>>
>>
>> The output is a .txt file and is 'almost' lower triangular in the sense
>> that it is just the triangle below the diagonal.
>>
>>
>>
>> So for example a 4-by-4 distance matrix appears as,
>>
>>
>>
>> 1
>>
>> 2 3
>>
>> 4 5 6
>>
>>
>>
>> i.e. it looks like a lower triangular of a 3-by3.
>>
>>
>>
>> I thought I might be able to use "diag" to add zeros but apparently not.
>>
>>
>>
>> It's a problem because my matrix is actually 1989-by-1989 not 4-by-4
>>
>>
>>
>> I would not be at all surprised if the solution is obvious but I cannot
>> quite see how to read this into R.
>
>
> You can use scan to get the entries from the file in row order. Then
> create the matrix to hold the result and overwrite the elements in the
> upper triangle with scanned vector. (R stores matrices in
> column-major order so the row-major order from your file corresponds
> to the upper triangle, not the lower triangle). I'll leave it to you
> to work out the symmetrization operation.
>
> > file.show("/tmp/tri.dat")
> 1
> 2 3
> 4 5 6
> 7 8 9 10
>
> > mm <- array(0, c(4,4))
> > mm[upper.tri(mm, diag = TRUE)] <- scan("/tmp/tri.dat")
> > mm
> [,1] [,2] [,3] [,4]
> [1,] 1 2 4 7
> [2,] 0 3 5 8
> [3,] 0 0 6 9
> [4,] 0 0 0 10
> > (res <- mm + t(mm))
> [,1] [,2] [,3] [,4]
> [1,] 2 2 4 7
> [2,] 2 6 5 8
> [3,] 4 5 12 9
> [4,] 7 8 9 20
> > diag(res) <- diag(res)/2
> > res
> [,1] [,2] [,3] [,4]
> [1,] 1 2 4 7
> [2,] 2 3 5 8
> [3,] 4 5 6 9
> [4,] 7 8 9 10
>
> ______________________________________________
> R-help@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help