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

# Re: st: RE: mata: columns of different eltypes in a transmorphic matrix

 From Nick Cox <[email protected]> To "[email protected]" <[email protected]> Subject Re: st: RE: mata: columns of different eltypes in a transmorphic matrix Date Thu, 10 Oct 2013 10:06:21 +0100

```This is an excellent answer, but one simple point seems submerged. An
elementary strategy is to put numeric variables in a numeric matrix
and string variables in a string matrix.  I've often done that in Mata
programs, and never yet felt the need for structs, pointers, and so
forth.
Nick
[email protected]

On 10 October 2013 07:59, Joseph Coveney <[email protected]> wrote:
> László Sándor wrote:
>
> I would understand the limitation, but then don't understand what
> st_data/st_view matrices will be if the underlying data has both
> string variables and numeric variables. My code did not complain when
> I only had that before.
>
> And in any case, as my implementation is about lookups, indices and
> ordering, it would be a huge pain to collect the data in two matrices
> kept "in sync", meaning the same indices and ordering. Well-well.
>
> --------------------------------------------------------------------------------
>
> Mata's st_data() and st_view() might not have complained, but they
> returned only numeric variables to your matrices; variables containing
> strings were returned as columns of missing real values.  See below.
>
> For what you're doing, you can use -asarray()- for lookups of mixed
> data types.  And you can use pointers.  Or structs.  Consider
> something like
>
> pointer(transmorphic matrix) vector MixedElements
> transmorphic matrix A, B
> A = st_data(., .)
> A = select(A, missing(A[1, .])
> B = st_sdata(., .)
> B = select(B, missing(B[1, .])
> MixedElements = (A, B)
>
> You'd still need to keep track of indices and ordering, but you could
> dump everything into a single Mata thing (a pointer vector of mixed
> matrices . . . or a struct) if that will make keeping things in sync
> easier for you.  When it comes time to use it, choose which element
> type you want, select and dereference the corresponding matrix, and
> then select columns and rows of that at will.  It's probably too
> cumbersome to be doing this kind of thing manually all of the time,
> but for convenience you can define a List class for the same purpose
> that has all of the enabling behavior as methods, with storage
> nitty-gritty kept transparent to the user.
>
> Joseph Coveney
>
> . version 13.0
>
> .
> . clear *
>
> . set more off
>
> . quietly set obs 2
>
> . generate byte a = 1
>
> . generate str1 b = "B"
>
> .
> . mata:
> ------------------------------------------------- mata (type end to
> exit) ---------------------------------------------------------------------
> : mata set matastrict on
>
> :
> : void function test() {
>>         transmorphic matrix A
>>         A = st_data(., .)
>>         printf("A, st_data()\n")
>>         A
>>         eltype(A)
>>
>>         transmorphic matrix B
>>         B = st_sdata(., .)
>>         printf("\n\nB, st_sdata()\n")
>>         B
>>         eltype(B)
>>
>>         st_view(A, ., .)
>>         printf("\n\nA, st_view()\n")
>>         A
>>         eltype(A)
>>
>>         st_sview(B, ., .)
>>         printf("\n\nB, st_sview()\n")
>>         B
>>         eltype(B)
>> }
>
> :
> : test()
> A, st_data()
>        1   2
>     +---------+
>   1 |  1   .  |
>   2 |  1   .  |
>     +---------+
>   real
>
>
> B, st_sdata()
>        1   2
>     +---------+
>   1 |      B  |
>   2 |      B  |
>     +---------+
>   string
>
>
> A, st_view()
>        1   2
>     +---------+
>   1 |  1   .  |
>   2 |  1   .  |
>     +---------+
>   real
>
>
> B, st_sview()
>        1   2
>     +---------+
>   1 |      B  |
>   2 |      B  |
>     +---------+
>   string
>
> :
> : end
> -----------------------------------------------------------------------------------------------------------------------------------------------
>
> .
> end of do-file
>
> *
> *   For searches and help try:
> *   http://www.stata.com/help.cgi?search
> *   http://www.stata.com/support/faqs/resources/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/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/
```