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閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,712評論 0 7
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,660評論 25 708
  • 配套視頻教程 本文B站配套視頻教程[https://www.bilibili.com/video/BV1fp4y1...
    __豆約翰__閱讀 731評論 0 6
  • 很長時間沒記過事了,開學第三周。 身體已經適應了學校,心還沒有,半夢半醒間會以為自己在家。 想家,很想,承認這樣很...
    多二丫閱讀 277評論 0 0
  • 1990年的冬天,她出生在一個普通家庭。 她的父母是土生土長的農民,父親任他們村的一個小干部,母親是之前老村長的大...
    autumn丫丫閱讀 491評論 1 2