2016-05-31 1 views
1

Я новичок в Мата, и у меня есть сомнения относительно того, как работает st_select(). Я хочу извлечь матрицу с не пропущенными строками и сохранить ее как новую матрицу (nmF). Когда я запускаю свою программу, я получаю сообщение о том, что эта новая матрица не найдена. Я думаю, проблема в том, что мне нужно определить матрицу nmF перед сохранением моего результата, но я не знаю, как это сделать в Mata. Любой намек был бы очень признателен!Мата-манипуляция матрицы: выбор не пропущенных строк матрицы

cap program drop myexample 
program def myexample, rclass byable(recall) sortpreserve 
version 14 
syntax varlist [aweight iweight fweight] [if] [in] 
args var1 
tempname F rF nmF 

set more off 

local var1: word 1 of `varlist' 

mat `F' = (.,.,. \ 0,2,0 \ 0,0,3) 
mat list `F' 

mata st_matrix(st_local("rF"), colsum(st_matrix("`F'"))) /*1 x cols*/ 
mat list `rF' 

mata st_select(st_matrix(st_local("nmF")),st_matrix("`F'"), rowmissing(st_matrix("`F'"):==0)) 
*mata : st_matrix(st_local("nmF"), select(st_matrix("`F'"), rowmissing(st_matrix("`F'"):==0))) /* I have also tried this*/ 
mat list `nmF' 

end 
+0

Спасибо за быстрый повтор. Я также пробовал: st_matrix (st_local ("nmF"), select (st_matrix ("F '"), rowmissing (st_matrix ("' F' "): == 0)))', но я получаю такой же результат. Матрица не создается. – apereza

ответ

0

Я не могу определить конкретную причину, по которой ваш код не работал, но когда это происходит, часто бывает полезно упростить свой код и принять меры более медленно. Общая ошибка заключается в том, что Mata не может видеть локальные макросы в своем собственном праве.

Это работает:

tempname F rF nmF 
mat `F' = (.,.,. \ 0,2,0 \ 0,0,3) 
mat list `F' 

mata st_matrix(st_local("rF"), colsum(st_matrix("`F'"))) 
mat list `rF' 

mata 
work = st_matrix("`F'") 
st_matrix(st_local("nmF"), select(work, rowmissing(work) :== 0)) 
end 

mat list `nmF' 

Почему вы хотите использовать st_select() здесь вообще?

Контекст программы с переменными, весами, вариантами и тем, что здесь не кажется совершенно нерелевантным. «Минимальный» в https://stackoverflow.com/help/mcve так же важен, как «полный» и «поддающийся проверке».

+0

Спасибо! Все дело в скобках, помещенных в неправильном месте. Я написал 'rowmissing (st_matrix (" F "): == 0)' вместо 'rowmissing (st_matrix (" F ")): == 0'. – apereza

+0

Я должен был это увидеть! –