浩如烟海,细若指针

2018-01-16 王明 爬虫俱乐部 爬虫俱乐部

      有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

       喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

谈 起武侠小说,不得不提起一个传奇——金庸先生。金庸先生写的武侠小说是20世纪中国文学史上“无可比肩”的畅销书,后来小说翻拍成电视剧更是火遍家家户 户。小编最难忘得莫过于《笑傲江湖》。全宇宙第一强“东方不败”每次出场都伴随着极其拉风炫酷的口号“日出东方,唯我不败;千秋万代,一统江湖!”。那什 么造就了东方不败宇宙第一强呢?无疑是武林绝学——葵花宝典。任你独孤九剑,易筋经,吸星大法如何精妙强悍,也别想撼动葵花宝典一丝一毫地位。最令人想不 到的是葵花宝典的武器是一根普通到不能再普通的绣花针。你知道为什么吗?小编这就告诉你——浩如烟海,细若指针


指针的概念

指针是Mata的一种数据类型,也是Mata的特色之一。指针的概念比较复杂,但使用起来十分灵活。指针的应用也是Mata的精华之一,学习指针有助于我们更方便地使用Mata编程。

我们可以理解,Stata运行时的数据都是储存在计算机内存中,每个变量或者函数都有自己的内存单元。每一个内存单元都有一个唯一的编码,这个编码称为地址,即内存单元地址。我们访问内存单元都是由地址完成的。

例如命令:

a = (1,2,3,4)

其中,a是一个矩阵,在内存中占一个单元。设这个内存单元的地址为5,则这句话的意思是:将矩阵(1,2,3,4)送至内存中的5号单元内。

这 里,我们要区分两个概念——内存单元地址和内存单元内容,这两个是完全不同的概念。我们访问内存,作取数、存数操作,无非是把数据送到内存单元,或从内存 单元读出数据,这些都要求首先找到内存单元的地址。如同我们找到某房间的某人一样,房间号指向某一房间,这里就是地址指向某一单元。在Mata中,一个指 针代表了一个变量或者函数的地址。也可以这样说,所谓指针,就是地址,就是存放数据的内存地址。

指针的使用指南

指针可以指向变量、函数、表达式、数组、甚至另一个指针。尽管如此,不同指针的定义是很相似的,这里以变量指针为例,介绍变量指针的方法。

当生成一个指针时,一般形式是这样的:

p = &name

例如:

clear

mata //进入mata环境

a = (1,3\5,7) //生成一个矩阵a

a

p = &a //生成一个指向矩阵a的指针p

p1 = &a[1,1] //生成一个指向矩阵a的第1行第1列的指针p1

*&a //*和&互为逆运算,其实就等于a

p

p1

*p

*p1

(*p)[1,1]

end

例子如图所示。

从上图的运行结果可知,(*p)[1,1]*p1的结果是一样的,都指向矩阵第一行第一列的内容。当p指向矩阵a的时候,p存储的内容为0x1380a010,这实际上是矩阵a在内存中的存储地址。那么,我们要引用矩阵a时怎么办呢?这时,我们可以在p前加入运算符*。此时,*p代表了地址0x1380a010中的存储内容。

指 针的定义和引用用到了两种运算符——"&"和"*"。运算符&取其后所跟变量的地址(即矩阵a的地址),因此a是矩阵,&a则是 矩阵a 的内存地址;&与*互为逆运算。运算符"*"把其后紧跟的变量当作地址,并访问这个地址进行某些操作,假使p = &a ,则p是地址,此时*p代表矩阵a本身。

在例子中,*p*p1(*p)[2,2]分别指向了不同的内容,这里我们要加以注意。现在再补充出一例,希望读者能充分了解指针的用法。

如图所示,我们先定义了5个矩阵:

x00 = (0,0\0,0)

x11 = (1,1\1,1)

x22 = (2,2\2,2)

x33 = (3,3\3,3)

x44 = (4,4\4,4)

       然后我们定义如下两个指针:

p = &x00

p1 = (&x11,&x22 \ &x33,&x44)

那么,*p,(*p)[1,2],*p1[1,2],(*p1[1,2])[1,2]分别指向什么内容呢?结果如图所示

由 上图可知,*p等于矩阵x;这里值得注意的是,指针p的第一行第二列的规范写法是(*p)[1,2],而不能写成*p[1,2],要不然就会报 错;*p1[1,2]相当于*(&x22),而&x22是矩阵x22 = (2,2\2,2)的地址。由于*p1[1,2]相当于矩阵x22 = (2,2\2,2),所以(*p1[1,2])[1,2]是矩阵x22 = (2,2\2,2)中的第一行第二列,即2。

指针实例

如何往mata中批量导入数据。首先我们使用系统自带的汽车数据,保留前五个数据,然后把make,price,mpg,rep78分别导入到mata中。具体程序如下:

sysuseauto.dta,clear

keep in 1/5

mata

       for (i = 1; i<= 4; i++) {

              if (i == 1) var[i] = &st_sdata(., i)

              else var[i] = &st_data(., i)

              var[i]   //输出该列指针所储存的地址

              *var[i]  //输出该列地址所指向的值

       }

End

运行结果如下:

当然,要弄清楚这些复杂灵活的指针运算符不是一件容易的事,需要读者细细揣摩其中的含义。

我想葵花宝典的武器之所以是绣花针,是因为绣花针聚力于一点,自然无坚不摧,无所不破,无往不利。正如这篇推文中的指针一样,占据一个很小的位置,却可以储存很多东西。可谓是浩如烟海,细若指针。

     注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

文字编辑/赵宇亮

技术总编/刘贝贝


往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.命令sum2docx输出统计量表到docx文件

4.reg2docx报告你的实证结果吧!

5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件

6.putdocx+wordconvert—将实证结果输出到Word.docx)文档

7.如何从pdf中提取表格数据

8.爬虫俱乐部出品——获取上市公司数据的利器

9.爬虫俱乐部出品——实证结果输出命令

10.Putpdf--神奇的转换工具



关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号

公开收集正在保存拖拽至此处以完成收集私密