Syntax Mata错误3204

Syntax Mata错误3204,syntax,stata,Syntax,Stata,我不确定我为什么会出错 我认为这可能源于对结构语法的误解,但我不确定这是否是问题所在(如果存在多个问题,这并不奇怪) 我正在模拟代码(来自William Gould的Mata书),其中输入是标量,但我正在编写的程序的输入是colvector 本练习的目标是从列向量创建一个方阵(根据一些规则),一旦创建,就将该方阵自身相乘 代码如下: *! spatial_lag version 1.0.0 version 15 set matastrict on //---------------------

我不确定我为什么会出错

我认为这可能源于对结构语法的误解,但我不确定这是否是问题所在(如果存在多个问题,这并不奇怪)

我正在模拟代码(来自William Gould的Mata书),其中输入是标量,但我正在编写的程序的输入是colvector

本练习的目标是从列向量创建一个方阵(根据一些规则),一旦创建,就将该方阵自身相乘

代码如下:

*! spatial_lag version 1.0.0

version 15
set matastrict on
//--------------------------------------------------------------
local SL                struct laginfo

local RS                real scalar
local RC                real colvector
local RM                real matrix
//--------------------------------------------------------------
mata

`SL'
{
    //-------------------inputs:
    `RC'    v
    //-------------------derived:
    `RM'    W
    `RM'    W2
    `RS'    n
}

void lagset(`RC' v)
{
    `SL' scalar r
    // Input:
    r.v     =   v
    //I set the derived variables to missing:
    r.W     =   .z  
    r.W2    =   .z  
    r.n     =   .z  // length of vector V
}

`RM' w_mat(`SL' scalar r)
{
    if (r.W == .z) {
        real scalar row, i
        real scalar col, j
        r.W = J(r.n,r.n,0)
        for (i=1; i<=r.n; i++) {
            for (i=1; i<=r.n; i++) {
                if (j!=i) {
                    if (r.v[j]==r.v[i]) {
                        r.W[i,j] = 1
                    }
                }
            }
        }
    }
    return(r.W)
}

`RS' wlength(`SL' scalar r)
{
    if (r.n == .z) {
        r.n     =   length(r.v)
    }
    return(r.n)
}

`RM' w2mat(`SL' scalar r)
{
    if (r.W2 == .z) {
        r.W2    =   r.W * r.W
    }
    return(r.W2)
}
end
前两行运行良好,但当我运行其中最后两行时,我得到:

         w_mat():  3204  q[0,0] found where scalar required
         <istmt>:     -  function returned error
w_mat():在需要标量的位置找到3204 q[0,0]
:-函数返回错误

我误解了什么?

这个错误与结构无关。Stata只是抱怨,因为
lagset()
函数无效。也就是说,它不返回任何内容。因此,
q
最终是空的,这反过来又被不恰当地用作函数
w_mat()
的输入-因此
q[0,0]
引用。

对于初学者和我来说,似乎
lagset
没有返回任何东西。那么,在
w_mat
中用作输入的
q
是什么?是的,它确实改变了事情。我用“
SL”scalar lagset(
RC'v)”替换了该函数的开头,并在“return(r)”的末尾包含了一行。这会将错误更改为其他错误,我将尝试对此进行故障排除。从概念上讲,我认为我并不真正理解的是“r”是什么,以及为什么它是标量(这似乎就是所做的)。现在我需要在定义了值之后返回它,这是有意义的。我也不确定我是否理解你所有的问题。我想我是在定义q等于lagset(y)。我误解了吗?我的问题是想暗示一下。关键是当从
lagset
中没有返回任何内容时,
q
最终将成为
[0,0]
。有关您的其他问题,请参阅。谢谢,这很有帮助!文章的第五部分回答了我的问题;它还与对象的维度有关。从数学意义上讲,该实例似乎不一定是一个“标量”,但它需要有正维度才能被Mata读取。
         w_mat():  3204  q[0,0] found where scalar required
         <istmt>:     -  function returned error