Home  /  Resources & support  /  FAQs  /  Performing element-by-element operations on matrices

How do I perform element-by-element operations on matrices?

Title   Performing element-by-element operations on matrices
Author Allen McDowell, StataCorp

Matrix manipulations have been greatly enhanced since Stata 9 using the Mata language. One of the capabilities is an element-by-element calculation using the colon operator. For example:

. mata 
------------------------------------------------- mata (type end to exit) ------

: x 
       1   2
    +---------+
  1 |  1   2  |
  2 |  3   4  |
    +---------+

: y 
       1   2
    +---------+
  1 |  3   5  |
  2 |  7   9  |
    +---------+

: z = x :/ y

: z 
                 1             2
    +-----------------------------+
  1 |  .3333333333            .4  |
  2 |  .4285714286   .4444444444  |
    +-----------------------------+

: end 
--------------------------------------------------------------------------------

Or, in Stata, suppose I have the following two matrices, A and B,

. matrix A=(1,2,3,4,5 \ 6,7,8,9,10)
. mat list A 
        
A[2,5]
    c1  c2  c3  c4  c5
r1   1   2   3   4   5
r2   6   7   8   9  10
        
. matrix B=(11,12,13,14,15 \ 16,17,18,19,20)
. matrix list B 
        
B[2,5]
    c1  c2  c3  c4  c5
r1  11  12  13  14  15
r2  16  17  18  19  20

I want to perform element-by-element division. That is, suppose I want to generate the matrix C so each element of C is the ratio of the corresponding elements in A and B, so that C[1,1] = A[1,1]/B[1,1]; C[1,2] = A[1,2]/B[1,2]; etc.

First, I generate the matrix C so that it has the correct dimensions. I must fill in the elements with some value, so I chose zeros.

. matrix C = J(2,5,0)
. matrix list C 
        
C[2,5]
    c1  c2  c3  c4  c5
r1   0   0   0   0   0
r2   0   0   0   0   0

Now I can set up nested forvalues loops, with the outer loop indexing the rows and the inner loop indexing the columns.

forvalues i = 1/2 {
	forvalues j = 1/5 {
		 matrix C[`i',`j']= A[`i',`j']/B[`i',`j']
	}
}
        
matrix list C 
        
C[2,5]
           c1         c2         c3         c4         c5
r1  .09090909  .16666667  .23076923  .28571429  .33333333
r2       .375  .41176471  .44444444  .47368421         .5

I can easily modify the above code to accommodate other algebraic expressions involving the individual matrix elements and matrices of any dimensions.