Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Is there a way to create a zero-cell vector in Mata?

    Hello,

    I could not find a stack implementation in Mata, so I put together a quick one (see code below).
    The code works but because the matrix initializer J(r,c,z) does not permit r==0 or c==0, I had to resort to an ugly hack (the "initialized" variable) to simulate an empty stack.
    Also, I could not figure out how to shrink or grow a vector without losing content (other than by first copying the contents to another vector and then copying them back).
    Is there a better way of implementing this? Other ways to improve the code?

    Cheers,


    Code:
    set matastrict on        //all vars must be pre-declared 
    mata: 
        version 13.2
        mata clear
    
    
    //Class vdecStack provides a basic stack data structure
    class vdecStack {
        private:
            string colvector _arr
            string colvector _c
            real scalar  initialized
        public:
            void         new()    //constructor
             void        push()
             string scalar pop() 
             void        print()        
    }    
    
    void vdecStack::new()
    {
        initialized = 0
    }
    
    void vdecStack::push(string scalar item) {
        if (initialized  == 1 ) {
            _c    = _arr
            _arr = J(1,cols(_arr)+1,"")
            _arr[1..cols(_c)] = _c
            _arr[cols(_arr)] = item
        } 
        else {
            initialized = 1
            _arr =J(1,1,"")
            _arr[1] = item
        } 
    }
    
    
    string scalar vdecStack::pop() {
        if (initialized  == 0 ) {
            _error("nothing to pop")
            return
        }    
        string scalar item
        if (cols(_arr)==1 ) {
            item = _arr[1]
            _arr[1] = ""
            initialized  = 0
            return(item) 
        }
        item = _arr[cols(_arr)]    
        _arr =_arr[1,cols(_arr)-1]
        return(item)
    }
    
    void vdecStack::print()
    {
        if (initialized  == 0 ) {
            printf("[]\n")
            return
        }
        real scalar i
        printf("[")
         for (i=1; i< cols(_arr); i ++) {    
            printf("%s,",_arr[i])
         }
        printf("%s]\n",_arr[i])    
    }
    
    void numTest() {
        class vdecStack scalar s
        s = vdecStack()
        s.print()    
        printf("pushing 1\n")
        s.push("1")
        s.print()    
        printf("pushing 2\n")
        s.push("2")
        s.print()
        printf("%s popped\n", s.pop())
        s.print()
        printf("%s popped\n", s.pop())    
        s.print()
        printf("try to pop an empty stack\n")
        s.pop()
    }
    
    numTest()
    
    end

  • #2
    It works fine by me from version 12 onwards
    Code:
    : x=J(0,0,.)
    
    :
    : x=J(0,2,.)
    
    :
    : x=J(3,0,"")
    Kind regards nhb
    Kind regards

    nhb

    Comment

    Working...
    X