{smcl} {com}{sf}{ul off}{txt} {bf:Mata Course: Basics} {hline} {title:1. How to enter and exit Mata} {com}. . mata {txt}{hline 39} mata (type {cmd:end} to exit) {hline} {com}: end {txt}{hline} {com}. . mata {txt}{hline 39} mata (type {cmd:end} to exit) {hline} {com}: end {txt}{hline} . mata {txt}{hline 39} mata (type {cmd:end} to exit) {hline} {com}: {txt} {it:We will stay in Mata} {title:2. Treatment of expressions} {com}: 2+2 {it:<- type an expression, see the result} {res} 4 {com}: x = 2 + 2 {it:<- or assign an expression} {res} {com}: x {it:<- x is an expression ...} {res} 4{txt} {it: type an expression, see the result} {title:3. Errors} {com}: 2,,3 {err}invalid expression {txt}{search r(3000):r(3000);} {com}: y {res}{err} : 3499 y not found {txt}{search r(3499):r(3499);} Return code 3000 means "I don't understand". All other return codes mean, "I understood you alright, but I can't". {title:4. Types} {title:4.1 Types: Real} {com}: 2 + 3 {res} 5 {title:4.2 Types: Complex} {com}: 1+2i + 4-1i {res} 5 + 1i {com}: 1+2i - 2i {res} 1 {com}: 2.5e+3i {res} 2500i {title:4.3 Types: String} {com}: "Alpha" + "Beta" {res} AlphaBeta {title:4.4 Types: errors} {com}: 2 + "alpha" {res}{err} : 3250 type mismatch {txt}{search r(3250):r(3250);} {p 4 4 2} {it:"I understood you alright, but I can't."} {title:5. Vectors} {title:5.1 Vectors: Row} {com}: x = (1,2) {res} {com}: x {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}1 2{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: x + (3,4) {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}4 6{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: y = (3,4) {res} {com}: z = (x,y) {it:<- comma is an operator} {res} {com}: z {res} {txt}1 2 3 4 {c TLC}{hline 17}{c TRC} 1 {c |} {res}1 2 3 4{txt} {c |} {c BLC}{hline 17}{c BRC} {title:5.2 Vectors: Column} : a = (1\2) {res} {com}: a {res} {txt}1 {c TLC}{hline 5}{c TRC} 1 {c |} {res}1{txt} {c |} 2 {c |} {res}2{txt} {c |} {c BLC}{hline 5}{c BRC} {com}: b = (3\4) {res} {com}: c = (a\b) {it:<- backslash is an operator} {res} {com}: c {res} {txt}1 {c TLC}{hline 5}{c TRC} 1 {c |} {res}1{txt} {c |} 2 {c |} {res}2{txt} {c |} 3 {c |} {res}3{txt} {c |} 4 {c |} {res}4{txt} {c |} {c BLC}{hline 5}{c BRC} {title:6. Matrices} {com}: A = (1,2 \ 3,4) {res} {com}: A {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}1 2{txt} {c |} 2 {c |} {res}3 4{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: x\y {it:x and y are row vectors} {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}1 2{txt} {c |} 2 {c |} {res}3 4{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: a,b {it:a and b are column vectors} {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}1 3{txt} {c |} 2 {c |} {res}2 4{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: Z = (1+1i, 2+3i \ 3-2i, -1-1i) {res} {com}: Z {res} {txt} 1 2 {c TLC}{hline 21}{c TRC} 1 {c |} {res} 1 + 1i 2 + 3i{txt} {c |} 2 {c |} {res} 3 - 2i -1 - 1i{txt} {c |} {c BLC}{hline 21}{c BRC} {com}: S = ("1st element", "2nd" \ "third", "fourth") {res} {com}: S {res} {txt} 1 2 {c TLC}{hline 29}{c TRC} 1 {c |} {res}1st element 2nd{txt} {c |} 2 {c |} {res} third fourth{txt} {c |} {c BLC}{hline 29}{c BRC} {title:7. Functions} {com}: sqrt(4) {it:real result} {res} 2 {com}: sqrt(-4) {it:missing real result} {res} . {com}: findout = sqrt(-4) {res} {com}: findout {it:still missing} {res} . {title:7.1 Functions: Complex} {com}: sqrt(-4+0i) {it:CICO: Complex In, Complex Out} {res} 2i {com}: areal = -4 {res} {com}: acomplex = -4 + 0i {res} {com}: sqrt(areal) {res} . {com}: sqrt(acomplex) {res} 2i {com}: sqrt(C(areal)) C() {it:means "cast to complex"} {res} 2i {com}: sqrt(-4+2i) {res} .485868272 + 2.05817103i {title:7.2 Functions: Matrix} {com}: X = (76, 53, 48 \ 53, 88, 46 \ 48, 46, 63) {res} {com}: Xi = invsym(X) {res} {com}: Xi {res}{txt}[symmetric] 1 2 3 {c TLC}{hline 46}{c TRC} 1 {c |} {res} .0298458083 {txt} {c |} 2 {c |} {res}-.0098470272 .0216268926 {txt} {c |} 3 {c |} {res}-.0155497706 -.0082885675 .0337724301{txt} {c |} {c BLC}{hline 46}{c BRC} {com}: Xi*X {res} {txt} 1 2 3 {c TLC}{hline 46}{c TRC} 1 {c |} {res} 1 -8.67362e-17 -8.50015e-17{txt} {c |} 2 {c |} {res}-1.38778e-16 1 -1.02349e-16{txt} {c |} 3 {c |} {res} 0 1.11022e-16 1{txt} {c |} {c BLC}{hline 46}{c BRC} {title:7.3 Functions: Element-by-element (generalized scalar)} {com}: M = (1,2 \ 3,4 \ 5,6) {res} {com}: M {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}1 2{txt} {c |} 2 {c |} {res}3 4{txt} {c |} 3 {c |} {res}5 6{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: S = sqrt(M) // element-by-element {res} {com}: S {res} {txt} 1 2 {c TLC}{hline 29}{c TRC} 1 {c |} {res} 1 1.414213562{txt} {c |} 2 {c |} {res}1.732050808 2{txt} {c |} 3 {c |} {res}2.236067977 2.449489743{txt} {c |} {c BLC}{hline 29}{c BRC} {com}: S[1,2]*S[1,2] {res} 2 {title:8. Colon operators} {com}: A = (1,2 \ 3,4) {res} {com}: B = (5,6 \ 7,8) {res} {com}: A*B {res} {txt} 1 2 {c TLC}{hline 11}{c TRC} 1 {c |} {res}19 22{txt} {c |} 2 {c |} {res}43 50{txt} {c |} {c BLC}{hline 11}{c BRC} {com}: A:*B {res} {txt} 1 2 {c TLC}{hline 11}{c TRC} 1 {c |} {res} 5 12{txt} {c |} 2 {c |} {res}21 32{txt} {c |} {c BLC}{hline 11}{c BRC} Colon may be placed in front of any dyadic (binary) operator. {title:9. Programs} {com}: function add(a, b) > {c -(} > return(a+b) > {c )-} : add(1,2) {res} 3 {com}: add(1+2i, 4-1i) {res} 5 + 1i {com}: add(x, y) {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}4 6{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: add(A, A) {res} {txt}1 2 {c TLC}{hline 9}{c TRC} 1 {c |} {res}2 4{txt} {c |} 2 {c |} {res}6 8{txt} {c |} {c BLC}{hline 9}{c BRC} {com}: add("Alpha", "Beta") {res} AlphaBeta{txt} {p 4 4 2} Functions can be polymorphic (type free), {p 4 4 2} or not, {com}: real matrix id(real scalar n) > {c -(} > real scalar i > real matrix res > > res = J(n, n, 0) > for (i=1; i<=n; i++) {c -(} > res[i,i] = 1 > {c )-} > return(res) > {c )-} : I3 = id(3) {res} {com}: I3 {res}{txt}[symmetric] 1 2 3 {c TLC}{hline 13}{c TRC} 1 {c |} {res}1 {txt} {c |} 2 {c |} {res}0 1 {txt} {c |} 3 {c |} {res}0 0 1{txt} {c |} {c BLC}{hline 13}{c BRC} {com}: id("this") {res}{err} id(): 3253 nonreal found where real required : - function returned error {txt}{search r(3253):r(3253);} {com}: end {txt}{hline} {title:10. Built-in functions} {p 4 4 2} Mata has a function called {cmd:pi()}. {p 4 4 2} To see the source code associated with Mata function {cmd:xyz()}, in Stata, type {com}. viewsource pi.mata {res}{c TLC}{hline 54}{c TRC} {c |} *! version 1.0.0 15oct2004{col 62}{c |} {c |} version 9.0{col 62}{c |} {c |} mata:{col 62}{c |} {c |}{col 62}{c |} {c |} real scalar pi() return(3.141592653589793238462643){col 62}{c |} {c |}{col 62}{c |} {c |} end{col 62}{c |} {c BLC}{hline 54}{c BRC}{txt} You do not need to look at source to use function: {com}. . mata {txt}{hline 39} mata (type {cmd:end} to exit) {hline} {com}: pi() {res} 3.141592654 {com}: printf("%17.0g\n", pi()) {res} 3.14159265358979 {com}: end {txt}{hline} {p 4 4 2} Mata has builtin functions {cmd:sinh()}, {cmd:cosh()}, and {cmd:tanh()}: {com}. . viewsource sinh.mata {res}{c TLC}{hline 66}{c TRC} {c |} *! version 1.0.0 15oct2004{col 74}{c |} {c |} version 9.0{col 74}{c |} {c |} mata:{col 74}{c |} {c |}{col 74}{c |} {c |} numeric matrix sinh(numeric matrix u) return((exp(u)-exp(-u)):/2){col 74}{c |} {c |}{col 74}{c |} {c |} end{col 74}{c |} {c BLC}{hline 66}{c BRC}{txt} {com}. . viewsource cosh.mata {res}{c TLC}{hline 66}{c TRC} {c |} *! version 1.0.0 15oct2004{col 74}{c |} {c |} version 9.0{col 74}{c |} {c |} mata:{col 74}{c |} {c |} {col 74}{c |} {c |} numeric matrix cosh(numeric matrix u) return((exp(u)+exp(-u)):/2){col 74}{c |} {c |} {col 74}{c |} {c |} end{col 74}{c |} {c BLC}{hline 66}{c BRC}{txt} {com}. . viewsource tanh.mata {res}{c TLC}{hline 66}{c TRC} {c |} *! version 1.0.0 15oct2004{col 74}{c |} {c |} version 9.0{col 74}{c |} {c |} mata:{col 74}{c |} {c |} {col 74}{c |} {c |} numeric matrix tanh(numeric matrix u) {col 74}{c |} {c |} {c -(}{col 74}{c |} {c |} numeric matrix eu, emu {col 74}{c |} {c |} {col 74}{c |} {c |} eu = exp(u) {col 74}{c |} {c |} emu = exp(-u) {col 74}{c |} {c |} return( (eu-emu):/(eu+emu) ){col 74}{c |} {c |} {c )-}{col 74}{c |} {c |} {col 74}{c |} {c |} end{col 74}{c |} {res}{c BLC}{hline 66}{c BRC}{txt} {p 4 4 2} Mata has built-in funcdtion {cmd:_solvelower()}: {com}. viewsource _solvelower.mata {res}{c TLC}{hline 72}{c TRC} {c |} *! version 1.0.4 25jan2005{col 80}{c |} {c |} version 9.0{col 80}{c |} {c |}{col 80}{c |} {c |} mata:{col 80}{c |} {c |}{col 80}{c |} {c |} real scalar _solvelower({col 80}{c |} {c |} numeric matrix A, numeric matrix b, {col 80}{c |} {c |} |real scalar usertol, numeric scalar userd){col 80}{c |} {c |} {c -(}{col 80}{c |} {c |} real scalar tol, rank, a_t, b_t, d_t{col 80}{c |} {c |} real scalar n, m, i, im1, complex_case{col 80}{c |} {c |} numeric rowvector sum{col 80}{c |} {c |} numeric scalar zero, d{col 80}{c |} {c |}{col 80}{c |} {c |} d = userd{col 80}{c |} {c |}{col 80}{c |} {c |} if ((n=rows(A))!=cols(A)) _error(3205){col 80}{c |} {c |} if (n != rows(b)) _error(3200){col 80}{c |} {c |} if (isview(b)) _error(3104){col 80}{c |} {c |} m = cols(b){col 80}{c |} {c |} rank = n{col 80}{c |} {c |}{col 80}{c |} {c |} a_t = iscomplex(A){col 80}{c |} {c |} b_t = iscomplex(b){col 80}{c |} {c |} d_t = d<. ? iscomplex(d) : 0{col 80}{c |} {c |}{col 80}{c |} {c |} complex_case = a_t | b_t | d_t{col 80}{c |} {c |}{col 80}{c |} {c |} if (complex_case) {c -(}{col 80}{c |} {c |} if (!a_t) A = C(A){col 80}{c |} {c |} if (!b_t) b = C(b){col 80}{c |} {c |} if (d<. & !d_t) d = C(d){col 80}{c |} {c |} zero = 0i{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} else zero = 0 {col 80}{c |} {c |}{col 80}{c |} {c |} if (n==0 | m==0) return(0){col 80}{c |} {c |}{col 80}{c |} {c |} tol = solve_tol(A, usertol){col 80}{c |} {c |}{col 80}{c |} {c |} if (abs(d) >=. ) {c -(}{col 80}{c |} {c |} if (abs(d=A[1,1])<=tol) {c -(}{col 80}{c |} {c |} b[1,.] = J(1, m, zero){col 80}{c |} {c |} --rank{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} else {c -(}{col 80}{c |} {c |} b[1,.] = b[1,.] :/ d{col 80}{c |} {c |} if (missing(d)) rank = .{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |}{col 80}{c |} {c |} for (i=2; i<=n; i++) {c -(}{col 80}{c |} {c |} im1 = i - 1 {col 80}{c |} {c |} sum = A[|i,1\i,im1|] * b[|1,1\im1,m|]{col 80}{c |} {c |} if (abs(d=A[i,i])<=tol) {c -(}{col 80}{c |} {c |} b[i,.] = J(1, m, zero){col 80}{c |} {c |} --rank{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} else {c -(}{col 80}{c |} {c |} b[i,.] = (b[i,.]-sum) :/ d{col 80}{c |} {c |} if (missing(d)) rank = .{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} else {c -(}{col 80}{c |} {c |} if (abs(d)<=tol) {c -(}{col 80}{c |} {c |} rank = 0{col 80}{c |} {c |} b = J(rows(b), cols(b), zero){col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} else {c -(}{col 80}{c |} {c |} b[1,.] = b[1,.] :/ d{col 80}{c |} {c |}{col 80}{c |} {c |} for (i=2; i<=n; i++) {c -(}{col 80}{c |} {c |} im1 = i - 1 {col 80}{c |} {c |} sum = A[|i,1\i,im1|] * b[|1,1\im1,m|]{col 80}{c |} {c |} b[i,.] = (b[i,.]-sum) :/ d{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |}{col 80}{c |} {c |} {c )-}{col 80}{c |} {c |}{col 80}{c |} {c |} return(rank){col 80}{c |} {c |} {c )-}{col 80}{c |} {c |} {col 80}{c |} {c |} end{col 80}{c |} {res}{c BLC}{hline 72}{c BRC}{txt} {p 4 4 2} Recommendation: visit help system {p 8 8 2} mata > m4 > matrix > solvelower() {p_end} {p 12 2 2} then clock for source code {p 8 8 2} mata > language definition > goto {title:11. Programs and ado-files} {com}. sysuse auto {txt}(1978 Automobile Data) {com}. varsum mpg {res}{txt} sum = {res}1576 {com}. viewsource varsum.ado {res}{c TLC}{hline 65}{c TRC} {c |} *! version 1.0.0 {col 73}{c |} {c |} program varsum{col 73}{c |} {c |} syntax varname [if] [in]{col 73}{c |} {c |} marksample touse{col 73}{c |} {c |} mata: calcsum("`varlist'", "`touse'"){col 73}{c |} {c |} display as txt " sum = " as res r(sum){col 73}{c |} {c |} end{col 73}{c |} {c |}{col 73}{c |} {c |} mata:{col 73}{c |} {c |} void calcsum(string scalar varname, string scalar touse){col 73}{c |} {c |} {c -(}{col 73}{c |} {c |} real colvector x{col 73}{c |} {c |} real scalar sum, i{col 73}{c |} {c |}{col 73}{c |} {c |} st_view(x, ., varname, touse){col 73}{c |} {c |}{col 73}{c |} {c |} sum = 0{col 73}{c |} {c |} for (i=1; i<=rows(x); i++) {c -(}{col 73}{c |} {c |} sum = sum + x[i]{col 73}{c |} {c |} {c )-}{col 73}{c |} {c |}{col 73}{c |} {c |} st_numscalar("r(sum)", sum){col 73}{c |} {c |} {c )-}{col 73}{c |} {c |} end{col 73}{c |} {c BLC}{hline 65}{c BRC}{txt} {com}. drop _all {txt} {com}. set obs 10000 {txt}obs was 0, now 10000 {com}. gen x = uniform() {txt} {com}. varsum(x) {res}{txt} sum = {res}4998.4725 {txt} {hline} {bf:{view talk.smcl:Top}}