[R] working with matrices

John Fox jfox at mcmaster.ca
Wed Aug 27 13:53:58 CEST 2014

```Dear anna,

Unless the original matrix has a massive number of columns, why not just use loops? R programmers often have an unnecessary phobia of loops, and will puzzle over a programming problem for hours that can be solved by loops in seconds.

You don't say what specifically you want to do, but, for example:

> f <- function(X){
+   nc <- ncol(X)
+   Y <- matrix(0, nc, nc)
+   for (i in 1:(nc - 1)){
+     for (j in (i+1):nc){
+       Y[i, j] <- sum(X[, i] * X[, j])
+     }
+   }
+   return(Y)
+ }
>

> (A <- matrix(1:12, 4, 3))
[,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

> f(A)
[,1] [,2] [,3]
[1,]    0   70  110
[2,]    0    0  278
[3,]    0    0    0

The example is artificial, since it just computes part of the matrix product,

> upper.tri(diag(3)) * (t(A) %*% A)
[,1] [,2] [,3]
[1,]    0   70  110
[2,]    0    0  278
[3,]    0    0    0
>

but it has the structure that you outlined (if I understand it correctly).

For a moderate number of columns (you don't say how many you have), the computation isn't prohibitively slow:

> B <- matrix(rnorm(1e5), 100, 1000)
> system.time(f(B))
user  system elapsed
4.12    0.01    4.15

I hope this helps,
John

------------------------------------------------
John Fox, Professor
McMaster University
http://socserv.mcmaster.ca/jfox/

On Wed, 27 Aug 2014 04:54:44 +0100
anna pannas <anna_pannas at yahoo.co.uk> wrote:
> hello
>
> i want to fill a matrix by its upper off diagonal elements
>
> specifically I want to take the first and second column of  the matrix and I apply a function to then that returns a single number which I want to place in the (1,2) entry of the matrix, then I want to take the first and third column of the matrix and apply the same function, get the single number and place it to (2,3) entry of the matrix and so on
>
> how can i do it?
>
> thanks
> anna
>
> 	[[alternative HTML version deleted]]
>

```