# Re: st: re: matrix manipulation

 From Kit Baum To "Susan Olivia" Subject Re: st: re: matrix manipulation Date Fri, 12 Dec 2008 10:35:36 -0500

```<>
```
The following will do these three things. _underbar_ is a Mata function being defined in the code below. Note that one of the diagonal elements should fall under the threshold of 10, but it is being zapped within the for loop.
```
---------------------
mata: mata clear
mata:
void underbar(string scalar mat,
real scalar thresh)
{
real matrix B
real scalar i
B =  (st_matrix(mat) :< thresh) :/ st_matrix(mat)
for(i=1; i<=rows(B); i++) {
B[i,i] = 0
}
st_matrix("B", B)
}
end

sysuse auto,clear
qui reg price trunk weight length turn
mat list e(V)
mata: underbar("e(V)", 10)
mat list B
------------------------

```
You might want to see my FNASUG or UKSUG slideshow on Stata programming with Mata, available from my IDEAS page below, regarding use of the colon operator (:< or :/ above) or the st_* functions.
```

Kit Baum, Boston College Economics and DIW Berlin
http://ideas.repec.org/e/pba1.html
An Introduction to Modern Econometrics Using Stata:
http://www.stata-press.com/books/imeus.html

On Dec 12, 2008, at 09:50 , Susan Olivia wrote:

```
Thanks for the tips, Kit. I would like to use this opportunity to ask 3 follow up questions:
```
```
1) For each cell (i,j) of matrix B, I would like to replace its value with 1/(A[ij]) instead of dummy [0 1] as in before. In other words, matrix B[i,j] = 1/A[i,j] if A[i,j] < THRESHOLD. I seem having problem in doing this.
```
```
2) The syntax you suggested "underbar", I seem couldn't find this entry in the STATA manual. Can you please explain what is this doing? Perhaps once I know what "underbar" is really doing, I can tackle #1.
```
```
3) Also, when the threshold condition met, the diagonal element of matrix B is replaced to 1 or 1/aij. Ideally, I want the diagonal element to be zero. Is there an efficient way to do this? What I currently do is transform the matrix into variables and use the loop to change the diagonal element and then transform the variables into the matrix. I.e.
```
svmat B

local i=1
while `i'<=_N {
qui recode B`i' 1=0 in `i'
local i=`i'+1
}

mkmat B*, matrix(B)

Thanks in advance for any programming tips.

Cheers,

Susan

On Thu, Dec 11, 2008 at 8:00 AM, Kit Baum <baum@bc.edu> wrote:
<>
Susan said

I would like to create a binary matrix (say matrix B) using
the existing information from current matrix A.

Specifically, for each cell (i,j) of matrix B, I want to
replace its value with 1 if the value of the corresponding
cell (i,j) of matrix A is less than the specified threshold
value. In other words, matrix B[i,j] = 1 if A[i,j] <
THRESHOLD.

No subscripting required:

--------------------------------
mata: mata clear
mata:
void underbar(string scalar mat,
real scalar thresh)
{
st_matrix("B", (st_matrix(mat) :< thresh))
}
end

sysuse auto,clear
qui reg price trunk weight length turn
mat list e(V)
mata: underbar("e(V)",0.0001)
mat list B
-----------------------------------

```
You could pass the name of the result matrix to Mata as well if you wanted this to be a bit more general.
```
Kit Baum, Boston College Economics and DIW Berlin
http://ideas.repec.org/e/pba1.html
An Introduction to Modern Econometrics Using Stata:
http://www.stata-press.com/books/imeus.html

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/

```
```
*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/
```