MATLAB|绘图辅助工具箱tools使用说明


1. 引言

针对特定的研究目标相应的MATLAB程序中存在大量的重复模块,为了提高工作效率和程序的复用性,将本人经常使用的MATLAB程序模块重组设计成绘图辅助工具箱。

2. 功能简介

3. 标准参数对话框

3.1 问题描述

MATLAB除了数值计算代码的编写,我们往往修改输入参数,作为研究变量。如果直接在代码脚本中修改有两个问题:

  • 修改不便,必须进入代码内部,找出相关变量;
  • 不熟悉程序的人有可能将程序修改错误,得到错误的结果。

解决这一问题的一种方案是:采用参数对话框输入。但是,MATLAB自带的inputdlg函数功能有限,调用较为麻烦,因此在此基础上订制开发了paradlg

3.2 功能要点

该函数的功能要点为:

  • 创建标准化对话框
  • 支持多种数据格式:标量、向量、字符串,自动判别
  • 记忆上次输入参数

函数说明如下:

function para = paradlg(prompt0,dlg0,isShow)
% 题目:标准化对话框创建程序
% 输入:
%       prompt0     -- 提示语以及默认参数,n*2
%       dlg0        -- 可选定制化参数
%           .width  -- 对话框宽度
%           .title  -- 标题
%           .save   -- data_dlg后缀名
%       isShow      -- 是否弹出对话框,
% 输出:
%       para        -- 对话框输入参数,默认弹出,若isShow=0,则不弹出,数值取上次默认值
% 功能:
%       创建标准化参数输入对话框
%       支持 标量、向量、字符串
%       导出输入参数
%       记忆上次输入

3.3 基本调用方法

  • 构造prompt0数据,第一列为输入提示,第二列为默认参数;

  • 支持三类数据输入,标量、向量、字符串;

  • 调用paradlg函数,返回输入的数据集para

  • para中的元素依次赋值给目标的变量f_center,filename_pub,dt,f_range

  • 调用代码示例

prompt0 = {                                                         % 对话框参数
    '发射信号中心频率(kHz)', 100
    '发射信号中心频率(kHz)','B1_C1_F'
    '采样周期dt (e-9 s)',16
    '绘图频谱范围(kHz)',[0 20]
};

para = paradlg(prompt0);

f_center = para{1};                                                 % 发射信号中心频率(kHz)
filename_pub = para{2};                                             % 输出报告文件名
dt = para{3};                                                       % 采样周期
f_range =para{4};
  • 对话框


    paradlg.jpg-25.5kB
  • 参数读取结果
para = 
    [       100]
    'B1_C1_F'   
    [        16]
    [1x2 double]
mark

3.4 高级调用功能

如需控制对话框的宽度标题,则在函数paradlg中输入第二个变量dlg0

%       dlg0.width -- 对话框宽度
%       dlg0.title -- 对话框标题
%       dlg0.save  -- data_dlg后缀名
  • 调用代码
prompt0 = {                                                         % 对话框参数
    '发射信号中心频率(kHz)', []
    '发射信号中心频率(kHz)','B1_C1_F'
    '采样周期dt (e-9 s)',16
    '绘图频谱范围(kHz)',[0 20]
};

dlg0.width = 100;
dlg0.title = '信号谱分析参数输入';
dlg0.save  = 'freqpara';

para = tools.paradlg(prompt0,dlg0);

f_center = para{1};                                                 % 发射信号中心频率(kHz)
filename_pub = para{2};                                             % 输出报告文件名
dt = para{3};                                                       % 采样周期
f_range =para{4};    
  • 对话框效果


    mark

对于同一个程序,如果多次参数没有改变,可以让对话框不弹出:

para = tools.paradlg(prompt0,dlg0,0);

在不弹出对话框的情况下,直接载入上次设定的参数。

4. 文件读取模块

笔者自定义的文件读取模块,通过对系统默认函数改造得到,主要的改进是增加了路径记忆

4.1 文件路径读取

函数说明

function [dir_name] = getdir()
% 题目:获取文件夹名称
% 输出:
%       dir_name -- 文件夹路径

运行示例

  • 运行函数
mydir = tools.getdir;
  • 对话框


    mark
  • 获取路径
mydir =
D:\Coding\matlab\1701_tools

系统默认函数为:uigetdir

4.2 获取完整文件名

函数说明

function [fullname,pathname,filename] = getfile(type,ext)
% 题目:读取文件全名、路径、文件名
% 输入:
%       type        -- 类型标识
% 输出:
%       fullname    -- 全名
%       pathname    -- 路径
%       filename    -- 文件名

运行示例

  • 运行函数
[fullname,pathname,filename] = tools.getfile;
  • 选取文件
mark
  • 获取文件名与完整路径
fullname =
D:\Projects\1610-高频导波损伤监测\04.MATLAB\GUIGUW\g001.m

pathname =
D:\Projects\1610-高频导波损伤监测\04.MATLAB\GUIGUW\

filename =
g001.m

4.3 读取CSV数据文件

函数说明

function [data,para0] = getcsv(flag)
% 题目: 示波器输出csv数据标准读取
% 输入:
%       flag   -- flag==1,则弹出对话框,否则默认标准参数
%       R0     -- 读取信号数据起始行数
%       R1、C1 -- 特定单元格的位置参数
% 输出:
%       data   -- 信号数据
%       para0  -- 特定单元格参数
% 功能:
%       从R0行开始读取信号数据,直到末尾
%       读取(R1,C1)单元格的参数

CSV数据说明

本程序特定针对DPO2024仪器输出的CSV信号数据,其格式为:

Model,DPO2024
Firmware Version,1.25

Point Format,Y,
Horizontal Units,S,
Horizontal Scale,0.0001,
Sample Interval,8e-09,
Filter Frequency,2e+08,
Record Length,125000,
Gating,0.0% to 100.0%,0.0% to 100.0%
Probe Attenuation,10,10
Vertical Units,V,V
Vertical Offset,0,0
Vertical Scale,20,1
Label,,
TIME,CH1,CH2
-1.28000e-04,-0.45,0.0198438
-1.27992e-04,-0.4,0.02
-1.27984e-04,-0.4,0.025
-1.27976e-04,-0.5,0.0151562
...

CSV数据在Excel中打开的视图如下:

mark

数据读取的要点在于:

  • 需要跳过文件头的说明信息,以矩阵形式读取序列数据
  • 需要读取特定单元格的参数,如Sample Interval

运行示例

  • 运行代码
[data,para0] = tools.getcsv();
  • 参数输入
    如上所示,有效数据序列从17行开始;要读取7行2列的Sample Interval数据,在对话框输入7 2。


    mark
  • 数据结果


    mark
  • 不弹出参数对话框运行
    第一次设置好读取参数后,后续不需要重复设置,即可记忆以前的设定及文件路径。
[data,para0] = tools.getcsv(0);

4.4 读取TXT数据文件

函数说明

function data = gettxt(nrow_start)
% 题目: 读取txt数据文件,跳跃文件头说明行
% 输入:
%       nrow_start  -- 起始行
% 输出:
%       data        -- 信号数据

数据格式

一般仪器输出的数据为CSV、raw等格式,而数值模拟输出的数据往往是标准的txt格式。

mark

运行示例

  • 直接读取数据
data = gettxt()
  • 跳过10行读取数据
data = gettxt(10)
  • 对话框


    mark

``gettxt`函数尚存一些问题,曾经发生读数出错,如果无法正常使用,可以采用以下方法;

filename = tools.getfile();
data = load(filename);

4.5 读取mat文件

函数说明

function data = getmat()
% 题目:读取只有一个变量的矩阵数据mat文件

数据格式

.mat是MATLAB默认的数据格式,一般直接通过命令导入即可,但如果以下面的方式导入:

data = load('matlab.mat')
mark

读入的数据会形成一个结构体,不便后续操作。本函数通过数据格式转换,保证读取的数据依然为矩阵形式。

运行示例

  • 命令
data = tools.getmat;
  • 对话框


    mark
  • 结果


    mark

5. 绘图辅助

5.1 坐标轴与标题便捷标注

函数说明

function xyt(str_xyt)
% 题目:生成xlabel,ylabel,title

运行示例

  • 绘制典型sine图像
figure
tools.plot0;                                                                    % 绘制一个基本的sine
mark
  • 添加坐标轴及标题标注
tools.xyt({'时间 s','位移 mm','A typical sine wave'})                           % 图像标注
mark

以上代码相当于:

xlabel('时间 s')
ylabel('位移 mm')
title('A typical sine wave')
grid on
set(gcf,'color','white')

代码的集成效率大大提高。

5.2 图像刷白

函数功能

MATLAB默认绘图的图像有灰色底色,如:

mark

本函数的功能是figure底色改为白色,便于截图处理。

function white()    
% 题目:图像刷白
    set(gcf,'color','white');
    grid on;
end      % white  

运行示例

  • 调用代码
figure
tools.plot0;     

tools.white;
  • 运行效果


    mark

5.3 图像中贯通直线绘制

函数说明

function xline(position,lineSpec)
% 题目:输入MATLAB默认颜色向量
% 输入:
%       position    -- [x y],[1 0]在x=1处绘制竖线,[0 1]在y=1处绘制横线
%       lineSpec   -- 'r-*'
% 输出:辅助直线
% 示例:
%       xline([0 6],'r-')

问题描述

这是一个没有难度,但经常出现的问题。
在MATLAB绘图中,除了基本的数据绘图,我们往往需要绘制辅助性直线。

MATLAB中绘制这样的直线很简单,只需确定两个点即可。但是要确定贯通方向的坐标范围,较为繁琐,还需要根据主体数据进行调整。

运行示例

  • 测试代码
figure
tools.plot0;   

tools.xline([pi/2,0],'r--')                                                     % 竖向直线
tools.xline([0,sin(pi/4)],'m-.')                                                % 横向直线
  • 绘图效果


    mark

这一函数的不足之处在于,没有显示出直线所在的坐标刻度。

5.4 网格线增加绘制

函数说明

网格线增加绘制函数有两个:

  • xGrid
  • yGrid
function xGrid(x0,angle)
% 题目:图中增加x网格线
% 时间:2017.01.08

运行示例

  • 测试代码
figure
tools.plot0;   

tools.xGrid(pi/2,45)
tools.yGrid(sin(pi/4))
  • 运行效果


    mark

当坐标轴标签密集,显示不清楚,可以调整标签的角度。

5.5 当前图像保存为图片文件

函数说明

function saveGraph()
% 题目:保存gcf图像
% 功能:
%       自定义图片格式
%       自定义图片文件名编号
% 时间:2017.01.05

运行示例

  • 基本图像绘制
figure
tools.plot0; 
mark
  • 图像保存对话框
    此处可以输入文件名,批量存储图片,可以设置固定的前缀和后缀,以便查阅。


    mark
  • 批量存储图片效果


    mark

快捷使用技巧

本函数仅支持存储当前figure中的图像,gcf。

此函数需要经常调用,可以设置为快捷方式

  • 添加快捷方式


    mark
  • 编辑代码


    mark
  • 点击快捷方式


    mark

5.6 默认颜色序列

函数说明

运行示例

5.7 典型快捷绘图

函数说明

运行示例

6. 数据操作

6.1 数字与字符串序列粘贴

函数说明

function str_x = paste(x,prefix,suffix)
% 题目:对数值序列粘贴前后缀,构成字符串
% 输入:
%       x      -- 数值序列
%       prefix -- 前缀
%       suffix -- 后缀
% 输出:
%       str_x  -- 合并后字符串
% 作者: 马骋
% 2016.04.17 @HIT

运行示例

  • 测试代码
x = [1:10]';
str = tools.paste(x,'通道','原始信号');
  • 运行效果
str = 

    '通道1原始信号'
    '通道2原始信号'
    '通道3原始信号'
    '通道4原始信号'
    '通道5原始信号'
    '通道6原始信号'
    '通道7原始信号'
    '通道8原始信号'
    '通道9原始信号'
    '通道10原始信号'

这一功能主要用于多组数据绘图的legend字符串构造。

6.2 向量数值区间确定

函数说明

function rg = range(data)
% 题目:给出一个向量/矩阵的数值范围

本函数结合了max和min函数,主要用于绘图的坐标限确定。

运行示例

  • 测试代码
x = 1:10;
x_range = tools.range(x)
  • 运行效果
x_range =

     1
    10

6.3 行形式的数据转换列矩阵

函数说明

function mat = row2mat(row)
% 题目:将行向量或者行向量组成的矩阵转换为列向量形式
% 时间:2017.01.11

此函数用于矩阵形式的标准化,避免大量数据处理中矩阵维度不匹配的情况。

运行示例

  • 调用代码
a = rand(2,4)
a2 = tools.row2mat(a)
  • 运行结果
a =
    0.6787    0.7431    0.6555    0.7060
    0.7577    0.3922    0.1712    0.0318

a2 =
    0.6787    0.7577
    0.7431    0.3922
    0.6555    0.1712
    0.7060    0.0318

6.4 复数矩阵的归一化

函数说明

此函数用于信号处理中,复数结果的归一化计算。

function xNorm = norm(x)
% 题目:复数向量归一化
% 输入:
%       x           -- 复数向量
% 输出:
%       xNorm       -- 归一化后的向量
% 作者: 马骋
% 2016.04.17 @HIT

运行示例

  • 测试代码
a = 2*rand(2,4)+rand(2,4)*i
a_norm= tools.norm(a);
a_norm_abs = abs(a_norm)
  • 运行效果
a =
   1.1376 + 0.1656i   0.0238 + 0.2630i   0.3244 + 0.6892i   0.6224 + 0.4505i
   0.9388 + 0.6020i   0.6742 + 0.6541i   1.5886 + 0.7482i   1.0571 + 0.0838i

a_norm =
   0.9896 - 0.1441i   0.5346 - 0.3428i
   0.0207 - 0.2287i   0.3840 - 0.3725i
   0.2821 - 0.5995i   0.9047 - 0.4261i
   0.5414 - 0.3919i   0.6020 - 0.0477i

a_norm_abs =
    1.0000    0.6351
    0.2297    0.5350
    0.6626    1.0000
    0.6684    0.6039

注意,归一化以列向量为单位。

7. 信号处理

7.1 信号去趋势

函数说明

function data = clean(data0,tol)
% 题目:信号去除环境噪声(矩阵运算)
% 功能:去趋势项,对阈值一下的信号归零
% 输入:
%       data0 -- 原始激励信号
%       tol   -- 阈值

运行示例

  • 测试代码
M = tools.getcsv(0);                                                               % 读取csv文件
s = M(:,3);                                                                     % 提取典型信号
s2 = tools.clean(s);                                                            % 信号去除环境噪声

figure
plot(s),hold on
plot(s2)
legend({'原始信号','去趋势信号'})
grid on
  • 运行效果


    mark

7.2 低通滤波器设计

此处简要介绍,低通滤波器设计的详细说明见:

函数说明

function y=lowp(x,para,isFreqz)
% 题目: 低通滤波器
% 输入:
%       x       -- 原始信号序列
%       para.
%           f1  -- 通带截止频率
%           f3  -- 阻带截止频率
%           rp  -- 边带区衰减DB数设置
%           rs  -- 截止区衰减DB数设置
%           fs  -- 序列x的采样频率
%           type-- 滤波器类型
%       isFreqz -- 是否绘制滤波器曲线
% 输出:
%       y      -- 滤波后的信号
% 功能:
%       低通滤波,滤除高频噪音
%       Cheby1
%       Butterworth
% 注意:
%       通带或阻带的截止频率的选取范围是不能超过采样率的一半
%       f1,f3的值都要小于fs/2
%       rp=0.1;rs=30;%通带边衰减DB值和阻带边衰减DB值

运行示例

  • 测试代码
[M,dt] = tools.getcsv(0);                                                       % 读取csv文件
s = M(:,3);                                                                     % 提取典型信号

% 参数对话框
prompt0 = {
    '低通滤波 fp-fs kHz', [500 700]
    '低通滤波 Rp',0.1
    '是否显示滤波器频谱',1   
};

dlg0.save = 'myfilter';
para0 = tools.paradlg(prompt0,dlg0);                                            % 对话框参数

para_lp.f1 = para0{1}(1)*1e3;                                                   % 滤波器 fp
para_lp.f3 = para0{1}(2)*1e3;                                                   % 滤波器 fs
para_lp.rp = para0{2};                                                          % 滤波器 rp
para_lp.rs = 30;                                                                % 滤波器 rs
para_lp.fs = 1/dt;                                                              % 信号采样频率

para_lp.type = 1;                                                               % 滤波器类型:切比雪夫-1
flag = para0{3};                                                                % 是否绘制滤波器频域曲线

s_lp = tools.lowp(s,para_lp,flag);                                              % 输入信号-滤波

figure                                                                          % 滤波前后对比
plot(s),hold on
plot(s_lp)
legend({'原始信号','滤波后信号'})
tools.white;
  • 滤波参数对话框


    mark
  • 滤波器频域特性曲线


    mark
  • 滤波效果


    mark

7.3 多波峰正弦信号生成

这一问题的详细描述见:T301|超声导波激励信号的生成与频谱分析

函数说明

function toneburst()
% 题目: 超声导波激励信号的生成与频谱分析
% 参数:
%       N  - cycle数,即激励信号波峰数
%       fc - 激励信号中心频率
% 功能:
%       生成激励信号序列
%       绘制时域图和频域图
%       对比不同cycle数信号的特征
%       输出txt文件
% 作者: 马骋
% 2016.03.18 @HIT    

运行示例

  • 调用代码
[s,fs] = tools.toneburst;
  • 参数对话框


    mark
  • 信号时程与频谱


    mark
  • 生成信号数据文件


    mark

7.4 激励信号带宽计算

函数说明

此函数用于计算给定激励信号的频域带宽,确定信号宽带、窄带的指标,采用3Db带宽。

% 题目:计算给定信号的3db带宽
% 输入:
%       fs  -- 采样频率
%       S   -- 信号时程
%       flag-- 是否绘制图像
% 时间:2017.01.10
```

### 运行示例

- 测试代码
```
[s,fs] = tools.toneburst;
[band3db,x0] = tools.getband3db(fs,s);
band3db_fk = band3db/1000;
```
- 运行结果
![mark](http://upload-images.jianshu.io/upload_images/845620-615767fffbde8aa1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 带宽数值z,单位为kHz
```
band3db_fk
 =
   28.1254
```

# 8. 其他函数

## 8.1 工具箱版本显示

### 函数说明

此函数用于记录程序的更新历程和版本信息。

```
function version()   
% 题目:版本自动说明
```

### 运行示例

- 调用代码

```
tools.version
```
- 运行效果

```
版本说明:数据处理与信号绘图辅助工具箱
马骋,创建于2016.04.29 

更新日志:
2016.04.29,增加xyt函数;
2016.04.30,增加getmat函数;
2016.04.30,更新paradlg冲突bug;
2016.05.03,更新paradlg空格bug;
2016.05.03,增加range函数;
2016.05.04,增加row2mat函数;
2016.05.06,增加html函数;
2016.05.06,增加clean函数;
2016.12.13,增加colorOrder函数;
2016.12.21,增加xline函数;
2017.01.05,修改paradlg函数,智能弹出;
2017.01.05,增加saveGragh函数;
2017.01.08,增加xGrid,yGrid网格线
2017.01.08,增加plot0函数;
2017.01.10,增加intersection函数;
2017.01.10,增加get3band3db函数;
2017.01.10,增加toneburst函数;
```

# 9. 使用技巧

## 9.1 工具箱的路径设置

自编MATLAB函数(如信号处理函数库tools.m),如果不做进一步的设置,往往只能在函数文件下下调用,如果工作路径在其他文件夹下则不能使用。

![](http://upload-images.jianshu.io/upload_images/845620-1fa01690b481872d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

基本的解决方法是:将`tools.m`添加到MATLAB可以搜索的路径下:

- 设置添加路径对话框
```
pathtool
```
- 添加`tools`敢刷了所在的路径
![mark](http://upload-images.jianshu.io/upload_images/845620-fead70533c39de3a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

## 9.2 函数帮助信息显示

输入函数名,按`F1`键,即可显示函数的帮助信息。

![mark](http://upload-images.jianshu.io/upload_images/845620-69a37588d3bcd67b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

与MATLAB内置函数的帮助显示一样。

# 10. 更新与下载

本工具箱功能持续更新,代码托管于coding.net,下载网址为:

[coding.net-frank0449](https://coding.net/u/frank0449/p/matlab/git)

![mark](http://upload-images.jianshu.io/upload_images/845620-659245c637400c09.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,616评论 0 7
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • 配套视频教程 本文B站配套视频教程[https://www.bilibili.com/video/BV1fp4y1...
    __豆约翰__阅读 708评论 0 6
  • 很长时间没记过事了,开学第三周。 身体已经适应了学校,心还没有,半梦半醒间会以为自己在家。 想家,很想,承认这样很...
    多二丫阅读 269评论 0 0
  • 1990年的冬天,她出生在一个普通家庭。 她的父母是土生土长的农民,父亲任他们村的一个小干部,母亲是之前老村长的大...
    autumn丫丫阅读 480评论 1 2