Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

# Re: st: Mata: editing values in a matrix when a condition is met

 From Nick Cox To statalist@hsphsun2.harvard.edu Subject Re: st: Mata: editing values in a matrix when a condition is met Date Wed, 8 Feb 2012 09:24:12 +0000

```This solution is convenient but there are still loops, within -mm_cond()-.

There is a one-line alternative with no extra functions:

: a = runiform(5,5)

: a
1             2             3             4             5
+-----------------------------------------------------------------------+
1 |  .1369840784    .643220668   .5578016951   .6047949435    .684175977  |
2 |  .1086679425   .6184581316   .0610637818   .5552388297   .8714490768  |
3 |  .2551498795   .0445188014   .4241557193   .8983461575   .5219247625  |
4 |  .8414094402   .2110076593   .5644091703   .2648020918   .9477426449  |
5 |  .2769154108   .1180158504   .4079702524   .7219491643   .8716910495  |
+-----------------------------------------------------------------------+

: b = 0.8 *  (a :>= 0.8) + 0.2 * (a :<= 0.2) + (a :> 0.2 :& a:< 0.8) :* a

: b
1             2             3             4             5
+-----------------------------------------------------------------------+
1 |           .2    .643220668   .5578016951   .6047949435    .684175977  |
2 |           .2   .6184581316            .2   .5552388297            .8  |
3 |  .2551498795            .2   .4241557193            .8   .5219247625  |
4 |           .8   .2110076593   .5644091703   .2648020918            .8  |
5 |  .2769154108            .2   .4079702524   .7219491643            .8  |
+-----------------------------------------------------------------------+

Nick

On Wed, Feb 8, 2012 at 4:08 AM, Christopher Baum <kit.baum@bc.edu> wrote:

> Using Ben Jann's -moremata- from SSC to do the winsorizing:
>
> : a=runiform(5,5)
>
> : a
>                 1             2             3             4             5
>    +-----------------------------------------------------------------------+
>  1 |  .3590218453   .0936944787   .3864043248   .8279724028   .7848427724  |
>  2 |  .9620482328   .7566794683    .583137149   .4482575031   .2592765098  |
>  3 |  .3781643927   .4720275472   .9826083879   .3655504752   .9070760873  |
>  4 |  .9481407967   .8307412954   .5391620845   .0043095979    .379461355  |
>  5 |   .686426234   .1595839853   .8743242584   .7100557149   .7607446529  |
>    +-----------------------------------------------------------------------+
>
> : b = mm_cond(a :>= 0.8, 0.8, a)
>
> : b = mm_cond(b :<=0.2, 0.2, b)
>
> : b
>                 1             2             3             4             5
>    +-----------------------------------------------------------------------+
>  1 |  .3590218453            .2   .3864043248            .8   .7848427724  |
>  2 |           .8   .7566794683    .583137149   .4482575031   .2592765098  |
>  3 |  .3781643927   .4720275472            .8   .3655504752            .8  |
>  4 |           .8            .8   .5391620845            .2    .379461355  |
>  5 |   .686426234            .2            .8   .7100557149   .7607446529  |
>    +-----------------------------------------------------------------------+

Pablo Mitnik

> I need to edit the values of a large matrix in Mata. More precisely, I
> need to replace all values smaller than a number X by X, and all numbers
> greater than Y by Y. The functions editvalue and _editvalue allow you to
> replace a scalar by other in a matrix, but not to specify a condition
> like x < X to trigger the replacement. Is there a way of doing this
> economically, that is, without looping over all elements of the matrix?

*
*   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/
```