Pytorch之線性代數(shù)

矩陣

  1. 矩陣初始化
  2. 矩陣元素運(yùn)算
  3. 矩陣的乘法
  4. 矩陣的轉(zhuǎn)置
  5. 矩陣對(duì)應(yīng)列行的最大值倘感,最小值留特,和
  6. 矩陣的其他操作:行列數(shù)伏恐、切片孩哑、復(fù)制、非0元素的下標(biāo)
  7. 矩陣的行列式
  8. 矩陣的逆和偽逆
  9. 矩陣的對(duì)稱
  10. 矩陣的秩翠桦、跡
  11. 矩陣求解
  12. 矩陣的特征值與特征向量(EVD)

矩陣

1. 矩陣初始化

Tensor的初始化

# 全零矩陣

In [1]: import torch

In [2]: myZero = torch.zeros(3,3)

In [3]: myZero
Out[3]: 
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

In [4]: type(myZero)
Out[4]: torch.Tensor

In [5]: myZero.dtype
Out[5]: torch.float32

# 全一矩陣

In [6]: myOnes = torch.ones(3,3)

In [8]: myOnes
Out[8]: 
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

# 單位矩陣

In [9]: myEye = torch.eye(5)

In [10]: myEye
Out[10]: 
tensor([[1., 0., 0., 0., 0.],
        [0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 1.]])

# 對(duì)稱矩陣

In [11]: a1 = [1,2,3,4,5]

In [13]: a1 = torch.tensor(a1)

In [14]: a1
Out[14]: tensor([1, 2, 3, 4, 5])

In [15]: myDiag = torch.diag(a1)

In [16]: myDiag
Out[16]: 
tensor([[1, 0, 0, 0, 0],
        [0, 2, 0, 0, 0],
        [0, 0, 3, 0, 0],
        [0, 0, 0, 4, 0],
        [0, 0, 0, 0, 5]]) 

# 隨機(jī)矩陣

In [17]: myRand = torch.rand(3,3)

In [18]: myRand
Out[18]: 
tensor([[0.9588, 0.0139, 0.2303],
        [0.4332, 0.1916, 0.4152],
        [0.4848, 0.3361, 0.9799]])
  • 直接創(chuàng)建tensor
In [19]: a = torch.tensor([[1,2,3],[4,5,6]])

In [20]: a
Out[20]: 
tensor([[1, 2, 3],
        [4, 5, 6]])
  • 通過from_numpy() 函數(shù)將ndarray數(shù)據(jù)類型轉(zhuǎn)化成矩陣(tensor)
In [21]: import numpy as np

In [22]: a = np.arange(12).reshape(3,4)

In [23]: b = torch.from_numpy(a)

In [24]: b
Out[24]: 
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]], dtype=torch.int32)
2. 矩陣元素運(yùn)算

矩陣的元素運(yùn)算是指矩陣在元素級(jí)別的加横蜒、減、乘销凑、除運(yùn)算丛晌。
(1)元素相加和相減。
條件:矩陣的行數(shù)和列數(shù)必須相同斗幼。
數(shù)學(xué)公式:(A±B)_i,_j=A_i,_j±B_i,_j

In [27]: myOnes = torch.ones(4,4)

In [28]: myOnes
Out[28]: 
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])

In [29]: myEye = torch.eye(4)

In [30]: myEye
Out[30]: 
tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])

In [31]: myOnes + myEye
Out[31]: 
tensor([[2., 1., 1., 1.],
        [1., 2., 1., 1.],
        [1., 1., 2., 1.],
        [1., 1., 1., 2.]])

In [32]: myOnes - myEye
Out[32]: 
tensor([[0., 1., 1., 1.],
        [1., 0., 1., 1.],
        [1., 1., 0., 1.],
        [1., 1., 1., 0.]])

(2)矩陣數(shù)乘:一個(gè)數(shù)乘以一個(gè)矩陣澎蛛。

數(shù)學(xué)公式:(cA)_i,_j=c·A_i,_j

In [37]: b 
Out[37]: 
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]], dtype=torch.int32)

In [39]: b*10
Out[39]: 
tensor([[  0,  10,  20,  30],
        [ 40,  50,  60,  70],
        [ 80,  90, 100, 110]], dtype=torch.int32)

(3)矩陣所有元素求和。
數(shù)學(xué)公式:
\operatorname{sum}(A)=\sum_{i=1}^{m} \sum_{j=1}^{n} A_{i, j}=1 其中, 1<i<m, 1<j<n

In [40]: torch.sum(b)
Out[40]: tensor(66)

(4)矩陣所有元素之積

數(shù)學(xué)公式:
\operatorname{product}(A)=\prod_{i=1}^{m} \prod_{j=1}^{n} A_{i, j}=1 其中, 1<i<m, 1<j<n

In [47]: a = torch.arange(4).reshape(2,2)+1

In [48]: a
Out[48]: 
tensor([[1, 2],
        [3, 4]])

In [49]: torch.prod(a)
Out[49]: tensor(24)

(5)矩陣各元素的n次冪:n=3蜕窿。
數(shù)學(xué)公式:
A_{ij}^3=A_{ij}×A_{ij}×A_{ij}

In [50]: a
Out[50]: 
tensor([[1, 2],
        [3, 4]])

In [52]: torch.pow(a,3)
Out[52]: 
tensor([[ 1,  8],
        [27, 64]])
3. 矩陣的乘法

(1)矩陣各元素的積:矩陣的點(diǎn)乘同維對(duì)應(yīng)元素的相乘瓶竭。當(dāng)矩陣的維度不同時(shí),會(huì)根據(jù)一定的廣播規(guī)則將維數(shù)擴(kuò)充到一致的形式渠羞。
數(shù)學(xué)公式:
(A×B)_i,_j =A_i,_j×B_i,_j

In [64]: a
Out[64]: 
tensor([[1, 2],
        [3, 4]])

In [65]: b
Out[65]: 
tensor([[0, 1],
        [2, 3]])

In [66]: a*b
Out[66]: 
tensor([[ 0,  2],
        [ 6, 12]])

(2)矩陣內(nèi)積

數(shù)學(xué)公式:
[\boldsymbol{A}, \boldsymbol{B}]_{i, j}=\boldsymbol{A}_{i, 1} \boldsymbol{B}_{1, j}+\boldsymbol{A}_{i, 2} \boldsymbol{B}_{2, j}+\cdots+\boldsymbol{A}_{i n} \boldsymbol{B}_{n j}=\sum_{r=1}^{n} \boldsymbol{A}_{i, r} \boldsymbol{B}_{r, j^{\circ}}

In [68]: a
Out[68]: 
tensor([[1, 2],
        [3, 4]])

In [69]: b
Out[69]: 
tensor([[0, 1, 2],
        [3, 4, 5]])

In [70]: torch.dot(a,b)
Traceback (most recent call last):

  File "<ipython-input-70-5682e150e844>", line 1, in <module>
    torch.dot(a,b)
# 報(bào)錯(cuò),只允許一維的tensor,只適合向量內(nèi)積
RuntimeError: 1D tensors expected, got 2D, 2D tensors at C:\w\1\s\tmp_conda_3.6_045031\conda\conda-bld\pytorch_1565412750030\work\aten\src\TH/generic/THTensorEvenMoreMath.cpp:723

#官方提示此功能不廣播智哀。有關(guān)廣播的矩陣乘法次询,請(qǐng)參見torch.matmul()
In [71]: torch.mm(a,b)
Out[71]: 
tensor([[ 6,  9, 12],
        [12, 19, 26]])

In [72]: torch.matmul(a,b)
Out[72]: 
tensor([[ 6,  9, 12],
        [12, 19, 26]])

(3)向量內(nèi)積、外積

? x=\left(x_{1}, x_{1}, ...,x_{m}\right) y=\left(y_{1}, y_{2},...,y_{n}\right)

向量內(nèi)積:x y^{T}=\sum_{i=1}^{n} x_{i} y_{i}

向量外積:x ^{T}y=\left(\begin{array}{ccc}{x_{1} y_{1}} & {\cdots} & {x_{1} y_{n}} \\ {\vdots} & {} & {\vdots} \\ {x_{m} y_{1}} & {\cdots} & {x_{m} y_{n}}\end{array}\right)

In [73]: a1  = torch.tensor([2,1,0])

In [74]: a2 = torch.tensor([-1,2,1])

In [75]: a1
Out[75]: tensor([2, 1, 0])

In [76]: a2
Out[76]: tensor([-1,  2,  1])

In [77]: torch.dot(a1,a2)
Out[77]: tensor(0)

In [78]: torch.outer(a1,a2)
Traceback (most recent call last):
# 在pytorch中沒有outer函數(shù)
  File "<ipython-input-78-cc115fea0111>", line 1, in <module>
    torch.outer(a1,a2)

AttributeError: module 'torch' has no attribute 'outer'
# 解決辦法瓷叫,先將一維的向量轉(zhuǎn)換為二維屯吊,再利用矩陣內(nèi)積方法計(jì)算
In [86]: a1 = a1.reshape(1,3)

In [87]: a2 = a2.reshape(1,3)
# 轉(zhuǎn)置
In [88]: a1.T
Out[88]: 
tensor([[2],
        [1],
        [0]])

In [89]: torch.mm(a1.T,a2)
Out[89]: 
tensor([[-2,  4,  2],
        [-1,  2,  1],
        [ 0,  0,  0]])

(4)向量叉乘(叉積):運(yùn)算結(jié)果是一個(gè)向量而不是一個(gè)標(biāo)量。并且兩個(gè)向量的叉積與這兩個(gè)向量組成的坐標(biāo)平面垂直摹菠。

數(shù)學(xué)公式:

a=\left(x_{1}, y_{1}, z_{1}\right) b=\left(x_{2}, y_{2}, z_{2}\right)
a \times b=\left|\begin{array}{ccc}{\mathrm{i}} & {\mathrm{j}} & {\mathrm{k}} \\ {x_{1}} & {y_{1}} & {z_{1}} \\ {x_{2}} & {y_{2}} & {z_{2}}\end{array}\right|=\left(y_{1} z_{2}-y_{2} z_{1}\right) i-\left(x_{1} z_{2}-x_{2} z_{1}\right) j+\left(x_{1} y_{2}-x_{2} y_{1}\right) k
其中
i=(1,0,0) \quad j=(0,1,0) \quad \mathrm{k}=(0,0,1)
根據(jù)i盒卸、j、k間關(guān)系次氨,有:
a \times b=\left(y_{1} z_{2}-y_{2} z_{1},-\left(x_{1} z_{2}-x_{2} z_{1}\right), x_{1} y_{2}-x_{2} y_{1}\right)

例1蔽介、已知,a =(2煮寡,1虹蓄,0),b =(-1幸撕,2薇组,1),試求(1)a\times b(2)b\times a
解:(1)a\times b =(1坐儿,-2律胀,5):(2)b\times a =(-1宋光,2,5)

In [79]: torch.cross(a1,a2)
Out[79]: tensor([ 1, -2,  5])

In [80]: torch.cross(a2,a1)
Out[80]: tensor([-1,  2, -5])
4. 矩陣的轉(zhuǎn)置

數(shù)學(xué)公式:(A^T)_{ij} = A_{ij}

In [90]: a
Out[90]: 
tensor([[1, 2],
        [3, 4]])

In [91]: a.T
Out[91]: 
tensor([[1, 3],
        [2, 4]])

In [92]: a.transpose(1,0)
Out[92]: 
tensor([[1, 3],
        [2, 4]])
5. 矩陣對(duì)應(yīng)列行的最大值炭菌,最小值罪佳,和
In [99]: b 
Out[99]: 
tensor([[0, 1, 2],
        [3, 4, 5]])
# 計(jì)算矩陣中最大值的對(duì)應(yīng)索引
In [100]: b.argmax()
Out[100]: tensor(5)
# 計(jì)算矩陣列中最大值對(duì)應(yīng)的行索引
In [101]: b.argmax(axis=0)
Out[101]: tensor([1, 1, 1])
# 計(jì)算矩陣行中最大值對(duì)應(yīng)的列索引
In [102]: b.argmax(axis=1)
Out[102]: tensor([2, 2])
# 矩陣中的最大值
In [103]: b.max()
Out[103]: tensor(5)
# 矩陣列中的最小值
In [104]: b.min()
Out[104]: tensor(0)
# 矩陣列求和
In [105]: b.sum(axis=0)
Out[105]: tensor([3, 5, 7])
6. 矩陣的其他操作:行列數(shù)、切片娃兽、復(fù)制菇民、非0元素的下標(biāo)
In [106]: a
Out[106]: 
tensor([[1, 2],
        [3, 4]])
# 行列數(shù)
In [107]: m,n = a.shape

In [108]: m,n
Out[108]: (2, 2)

In [109]: b
Out[109]: 
tensor([[0, 1, 2],
        [3, 4, 5]])
# 切片
In [111]: b[1:]
Out[111]: tensor([[3, 4, 5]])

In [112]: b[:,1:]
Out[112]: 
tensor([[1, 2],
        [4, 5]])
# 復(fù)制
In [114]: c = torch.clone(b)

In [115]: c
Out[115]: 
tensor([[0, 1, 2],
        [3, 4, 5]])
# 隨機(jī)生成0-8,大小4*4
In [116]: d = torch.randint(0,9,(4,4))

In [117]: d
Out[117]: 
tensor([[3, 1, 2, 2],
        [4, 8, 3, 6],
        [5, 4, 4, 6],
        [0, 3, 0, 5]])
# 帥選出大于3的數(shù)
In [118]: d[d>3]
Out[118]: tensor([4, 8, 6, 5, 4, 4, 6, 5])

In [119]: d
Out[119]: 
tensor([[3, 1, 2, 2],
        [4, 8, 3, 6],
        [5, 4, 4, 6],
        [0, 3, 0, 5]])
# 非0元素的下標(biāo)
In [120]: torch.nonzero(d)
Out[120]: 
tensor([[0, 0],
        [0, 1],
        [0, 2],
        [0, 3],
        [1, 0],
        [1, 1],
        [1, 2],
        [1, 3],
        [2, 0],
        [2, 1],
        [2, 2],
        [2, 3],
        [3, 1],
        [3, 3]])
7. 矩陣的行列式
In [127]: a
Out[127]: 
tensor([[1, 2],
        [3, 4]])

In [128]: a = a.float()

In [129]: a
Out[129]: 
tensor([[1., 2.],
        [3., 4.]])
# a必須為浮點(diǎn)型投储,否則會(huì)報(bào)錯(cuò)
In [130]: torch.det(a)
Out[130]: tensor(-2.0000)
    
In [132]: d
Out[132]: 
tensor([[3, 1, 2, 2],
        [4, 8, 3, 6],
        [5, 4, 4, 6],
        [0, 3, 0, 5]])

In [133]: torch.det(d.float())
Out[133]: tensor(43.0000)
8. 矩陣的逆和偽逆

矩陣的逆

In [134]: a
Out[134]: 
tensor([[1., 2.],
        [3., 4.]])
# 矩陣的逆
In [135]: torch.inverse(a)
Out[135]: 
tensor([[-2.0000,  1.0000],
        [ 1.5000, -0.5000]])

注意:矩陣不滿秩第练,則會(huì)報(bào)錯(cuò)

矩陣的偽逆

In [143]: e = e.double()
# 最好使用float64,
In [144]: e
Out[144]: 
tensor([[3., 3., 3.],
        [3., 3., 3.],
        [3., 3., 3.]], dtype=torch.float64)
# 偽逆
In [145]: torch.pinverse(e)
Out[145]: 
tensor([[0.0370, 0.0370, 0.0370],
        [0.0370, 0.0370, 0.0370],
        [0.0370, 0.0370, 0.0370]], dtype=torch.float64)

In [146]: f = torch.ones((4,4),dtype=torch.float64)+3

In [147]: f
Out[147]: 
tensor([[4., 4., 4., 4.],
        [4., 4., 4., 4.],
        [4., 4., 4., 4.],
        [4., 4., 4., 4.]], dtype=torch.float64)

In [148]: torch.pinverse(f)
Out[148]: 
tensor([[0.0156, 0.0156, 0.0156, 0.0156],
        [0.0156, 0.0156, 0.0156, 0.0156],
        [0.0156, 0.0156, 0.0156, 0.0156],
        [0.0156, 0.0156, 0.0156, 0.0156]], dtype=torch.float64)
9. 矩陣的對(duì)稱
In [149]: a
Out[149]: 
tensor([[1., 2.],
        [3., 4.]])

In [150]: a*a.T
Out[150]: 
tensor([[ 1.,  6.],
        [ 6., 16.]])
10. 矩陣的秩玛荞、跡

矩陣的秩

In [151]: a
Out[151]: 
tensor([[1., 2.],
        [3., 4.]])
# 秩
In [152]: torch.matrix_rank(a)
Out[152]: tensor(2)

In [153]: e
Out[153]: 
tensor([[3., 3., 3.],
        [3., 3., 3.],
        [3., 3., 3.]], dtype=torch.float64)

In [154]: torch.matrix_rank(e)
Out[154]: tensor(1)

矩陣的跡

In [156]: a
Out[156]: 
tensor([[1., 2.],
        [3., 4.]])
# 跡
In [157]: torch.trace(a)
Out[157]: tensor(5.)

In [158]: b
Out[158]: 
tensor([[0, 1, 2],
        [3, 4, 5]])

In [159]: torch.trace(b)
Out[159]: tensor(4)
11. 矩陣求解

可逆矩陣的求解
AX=B

In [174]: A = torch.randint(0,10,(4,4),dtype=torch.float64)

In [175]: A
Out[175]: 
tensor([[1., 0., 9., 1.],
        [8., 5., 5., 6.],
        [9., 1., 0., 4.],
        [2., 0., 4., 0.]], dtype=torch.float64)

In [177]: B = torch.tensor([[1,10,0,1]],dtype=torch.float64)

In [178]: B
Out[178]: tensor([[ 1., 10.,  0.,  1.]], dtype=torch.float64)
# 求解
In [180]: (X,LU) = torch.solve(B.T,A)

In [181]: X
Out[181]: 
tensor([[ 0.0989],
        [ 2.7260],
        [ 0.2006],
        [-0.9040]], dtype=torch.float64)
# 驗(yàn)證
In [182]: torch.mm(A,X)
Out[182]: 
tensor([[ 1.0000],
        [10.0000],
        [ 0.0000],
        [ 1.0000]], dtype=torch.float64)

12. 矩陣的特征值與特征向量(EVD)

矩陣的特征向量和特征值:
Av=\lambda v
這里A是實(shí)對(duì)稱矩陣娇掏,v是特征向量,\lambda是特征值勋眯。下面我們使用Pytorch求取矩陣的特征值和特征向量婴梧。

In [200]: A = torch.tensor([[-1,1,0],[-4,3,0],[1,0,2]],dtype=torch.float64) 
# 求解特征值與特征向量
In [205]: (evals,evecs) = torch.eig(A,eigenvectors=True)
# 特征值
In [206]: evals
Out[206]: 
tensor([[2., 0.],
        [1., 0.],
        [1., 0.]], dtype=torch.float64)
# 特征向量
In [207]: evecs
Out[207]: 
tensor([[ 0.0000,  0.4082,  0.4082],
        [ 0.0000,  0.8165,  0.8165],
        [ 1.0000, -0.4082, -0.4082]], dtype=torch.float64)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市客蹋,隨后出現(xiàn)的幾起案子塞蹭,更是在濱河造成了極大的恐慌,老刑警劉巖讶坯,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件番电,死亡現(xiàn)場離奇詭異,居然都是意外死亡辆琅,警方通過查閱死者的電腦和手機(jī)漱办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婉烟,“玉大人娩井,你說我怎么就攤上這事∷圃” “怎么了洞辣?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叔营。 經(jīng)常有香客問我屋彪,道長,這世上最難降的妖魔是什么绒尊? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任畜挥,我火速辦了婚禮,結(jié)果婚禮上婴谱,老公的妹妹穿的比我還像新娘蟹但。我一直安慰自己躯泰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布华糖。 她就那樣靜靜地躺著麦向,像睡著了一般。 火紅的嫁衣襯著肌膚如雪客叉。 梳的紋絲不亂的頭發(fā)上诵竭,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音兼搏,去河邊找鬼卵慰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佛呻,可吹牛的內(nèi)容都是我干的裳朋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吓著,長吁一口氣:“原來是場噩夢啊……” “哼鲤嫡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绑莺,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤暖眼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纺裁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罢荡,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年对扶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惭缰。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浪南,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漱受,到底是詐尸還是另有隱情络凿,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響育拨,放射性物質(zhì)發(fā)生泄漏彰居。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一慧邮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦撰洗、人聲如沸篮愉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽试躏。三九已至,卻和暖如春设褐,著一層夾襖步出監(jiān)牢的瞬間颠蕴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工助析, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犀被,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓貌笨,卻偏偏與公主長得像弱判,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锥惋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容