Skip to content

falcon-xu/stp_lua

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

STP工具箱(lua语言)

1. 半张量积介绍

矩阵的半张量积(STP)是一种新的矩阵乘法,它将普通矩阵乘法推广到前阵列数与后阵行数不等的情况。推广后的乘法不仅保持了原矩阵乘法的主要性质,而且,具有伪交换性等比推广前更好的性质。 因此,这是一个便捷而有力的新的数学工具。

半张量积如下定义:

定义1.1 设$ X \in R^{tp} $为行向量,$Y \in R^p$为列向量,(即$X\succ_{t} Y$ ).将X等分成p份:$X = (X^1,...,X^p)$,这里,$X^i \in R^t,i=1,...,p$.
左半张量积,符号表示为$\ltimes $. 定义 $$ X \ltimes Y:=\sum_{i=1}^p X^i y_i \in R^t $$

定义1.2 给定两个矩阵$A \in M_{m \times n}$,$B \in M_{p \times q}$.A与B的(左)半张量积,记成$A \ltimes B$,定义为 $$A \ltimes B:= (A \otimes I_{t/n})(B \otimes I_t/p)$$ 这里$t = lcm(n,p)$是{n,p}的最小公倍数.

定义1.3 交换矩阵$W_{[m,n]}$是一个$mn \times mn$矩阵,其构造方式如下:列标号为(11,12,···,1n,···,m1,m2,···,mn),行标号为(11,21,···,m1,···,1n,2n,···,mn).然后将其在位置((I,J),(I,J))中的元素赋值为 $$ w_{(IJ),(ij)}=\delta {i,j}^{I,J}= \begin{cases} 1& \text{I=i and J=j} \ 2& \text{otherwise} \end{cases} $$ 定义1.4 A是一个$m \times n$矩阵,$m=pq$,$n=rs$.分块表示A $$ A=\begin{bmatrix} A{11}&A_{12}&\ldots&A_{1s}\ A_{21}&A_{22}&\ldots&A_{2s}\ \vdots& & &\vdots\ A_{q1}&A_{q2}&\ldots&A_{qs} \end{bmatrix} $$ 其中$A_{ij}$是$p \times r$矩阵。然后,分块转置$A^{T(p,r)}$被定义为 $$ A=\begin{bmatrix} A_{11}&A_{21}&\ldots&A_{q1}\ A_{12}&A_{22}&\ldots&A_{q2}\ \vdots& & &\vdots\ A_{1s}&A_{2s}&\ldots&A_{qs} \end{bmatrix} $$

2. STP工具箱介绍

STP工具箱(lua语言)可以更加方便地使用torch来计算矩阵的半张量积。

同时,为方便进行数学运算,我们将一些常用的数学运算及矩阵运算编写成函数,方便程序进行调用。

2.1 math文件夹储存了一些常用的数学公式

gcd -- 计算两个数的最大公约数 调用格式:gcd(a,b)

lcm -- 计算两个数的最小公倍数 调用格式:lcm(a,b)

log2 -- 计算以2为底的x的对数 调用格式:log2(x)

2.2 torchbasic文件夹储存了一些矩阵常用公式

det -- 计算矩阵的行列式 调用格式:det(A),其中A为方阵

rank -- 计算矩阵的秩 调用格式:rank(A),其中A为方阵

2.3 STP中一些基础函数

  1. $C=sp(A,B)$

描述:矩阵A和矩阵B的(左)半张量积(根据定义1.1)

输入参数:两个任意尺寸的矩阵A和B

返回值:$C = A \ltimes B$

  1. $C=sp1(A,B)$

描述:矩阵A和矩阵B的(左)半张量积(根据定义1.2)

输入参数:两个任意尺寸的矩阵A和B

返回值:$C = A \ltimes B$

(注意:sp和sp1在功能上是相同的。因为它们在内部使用不同的算法,所以在多维条件下,sp1应该比sp更快。)

  1. $C=spn(A_1,A_2,...,A_n)$

描述:计算有限矩阵集$A_1,...,A_n$半张量积

输入参数:任意尺寸的矩阵集A_1,...,A_n

返回值:$C = \ltimes_{i=1}^{n}A_{i}$

  1. $B=bt(A,p,r)$

描述:计算矩阵A的分块转置(定义1.10)

输入参数:A是要转置的矩阵,固定块的大小为p×r.

返回值:$B = A^{T(p,r)}$.

  1. $W =wij(m,n)$

描述:该函数产生一个$mn \times mn $交换矩阵(定义1.7)

输入参数:两个正整数m和n. n是可选的,默认n是m.

返回值:维数为$mn \times mn $的矩阵W.

  1. $v=vc(A)$

描述:该函数将矩阵转换为其列叠加形式

输入参数:矩阵$A=(a_{ij})_{m \times n}$.

返回值:$v= [a_{11} ... a_{m1} ... a_{1n} ... a_{mn}]^T$

  1. $v= vr(A)$

描述:该函数将矩阵转换为其行叠加形式

输入参数:矩阵$A=(a_{ij})_{m \times n}$.

返回值:$v= [a_{11} ... a_{1n} ... a_{m1} ... a_{mn}]^T$

  1. A=invvc(x,m)

描述:令$x=(x_{1},x_{2},\ldots,x_{p})$。这个函数将会将x转化为A,A的列数为m; $$ A=\begin{bmatrix} x_1&x_{m+1}&\ldots&x_{p-m+1}\ x_2&x_{m+2}&\ldots&x_{p-m+2}\ \vdots& & &\vdots\ x_m&x_{2m}&\ldots&x_{p} \end{bmatrix} $$ 如果p不是m的倍数,则在x的末尾加上最少的0,这样x的长度就变成m的倍数。

输入参数:x是一个向量;m是结果矩阵的行号,它是可选的。默认m是ceil(sqrt(length(v)))。

返回值:行号为m的矩阵A。

  1. A=invvr(x,n)

描述:令$x=(x_{1},x_{2},\ldots,x_{p})$。这个函数将会将x转化为A,A的行数为m; $$ A=\begin{bmatrix} x_1&x_{2}&\ldots&x_{n}\ x_{n+1}&x_{n+2}&\ldots&x_{2n}\ \vdots& & &\vdots\ x_{p-n+1}&x_{p-n+2}&\ldots&x_{p} \end{bmatrix} $$ 如果p不是n的倍数,则在x的末尾加上最少的0,使得x的长度变成n的倍数。

输入参数:x是一个向量;m是结果矩阵的列号,它是可选的。默认m是ceil(sqrt(length(v)))。

返回值:列数为m的矩阵A。

  1. v=dec2any(a,k,len)

描述:该函数将十进制数a转换为k进制的数

$a=a_sk^s+a_{s-1}k^{s-1}+\ldots+a_1k+a_0,a_s>0$

输入参数:a是正整数,k是可选的,k≥2。默认k为2。默认len为0,表示为$a_s\neq0$,但如果len>0且len>s+1,则len-s-1个零应加在返回值的开头。

返回值: $v=[x_{s},x_{s-1},\ldots,x_{1},x_{0}]$

  1. $det1=det(A)$

描述:求矩阵A的行列式。

输入参数:矩阵A为方阵。

返回值:det1 为矩阵A的行列式的值,det1为非负数。

  1. $C=eq(A,B)$

描述:生成一个与矩阵A,B维度相同的新的矩阵C,判断两个矩阵对应位置元素的值是否相等,如果相等则矩阵C该位置的值为1,否则为0。例如 $$ A = \begin{bmatrix} 2&1\ 0&3 \end{bmatrix}, B = \begin{bmatrix} 0&1\ 4&0 \end{bmatrix} $$ 则有 $$ C = \begin{bmatrix} 0&1\ 0&0 \end{bmatrix} $$ 输入参数:维度相同的矩阵A,B

返回值:返回逻辑矩阵C,即矩阵各个元素值只能为0或1

  1. $B=equ(A,n)$

描述:生成一个与矩阵A维度相同的新的矩阵B,判断矩阵A的各个元素的值是否等于n,如果相等则矩阵C该位置的值为1,否则为0。

例如 $$ A = \begin{bmatrix} 2&1\ 0&3 \end{bmatrix},n = 1 $$ 则有 $$ B = \begin{bmatrix} 0&1\ 0&0 \end{bmatrix} $$ 输入参数:A为任一矩阵,n为任一数

返回值:返回逻辑矩阵B,即矩阵各个元素值只能为0或1

  1. $x=isempty(a)$

描述:判断lm类a是否为空,如果为空,返回1,否则返回0

输入参数:a为lm类

返回值:如果lm类为空,返回1,否则返回0

  1. $rank1=rank(A)$

描述:求矩阵A的秩

输入参数:任一矩阵A

返回值:返回矩阵A的秩

  1. $B=sum(A)$

描述:如果A为矩阵,则求矩阵A每一列元素的和;如果A为向量,则求向量A所有元素的和

输入参数:A为矩阵或向量

返回值:若A为矩阵,则返回值B为行向量,每个元素为矩阵A每一列元素的和;若A为向量,则返回值B为一数值,即向量A所有元素的和

  1. $A=bubble(B)$

描述:对向量B中各个元素由小到大进行排序

输入参数:B为任一向量

返回值:返回对B由小到大进行排序的向量A

  1. $B=unique(A)$

描述:找出矩阵A的所有元素的种类,并且从小到大进行排序,例如 $$ A = \begin{bmatrix} 2&1\ 1&3 \end{bmatrix} $$ 则有 $$ B = \begin{bmatrix} 1&2&3 \end{bmatrix} $$ 输入参数:任一矩阵A

返回值:返回值B为一行向量,其中有矩阵A的所有元素的种类,并且按从小到大进行排序

  1. $C=setdiff_m(A,B)$

描述:求A与B的差集,即A,B均为向量,返回在A中有,而B中没有的值,结果向量将以升序排序返回。例如: $$ A = \begin{bmatrix} 2&1&4 \end{bmatrix}, B = \begin{bmatrix} 3&1 \end{bmatrix} $$ 则有 $$ C = \begin{bmatrix} 2&4 \end{bmatrix} $$ 输入参数:任意向量A,B

返回值:返回在A中有,而B中没有的值,结果向量将以升序排序返回

  1. $C=power(A,B)$

描述:如果A为一个数,B为矩阵,则返回的C与矩阵B同维度,且 $$ C_{ij} = A^{B_{ij}} $$ 如果A为一个矩阵,B为一个数,则返回的C与矩阵A同维度,且 $$ C_{ij} = A_{ij}^B $$ 如果A,B为维度相同的矩阵,则 $$ C_{ij} = A_{ij}^{B_{ij}} $$ 输入参数:A,B均为矩阵,或者A,B其中一个为矩阵,另一个为一个数

返回值:如果A,B均为矩阵,则返回与A,B同维度的矩阵。如果A,B其中一个为矩阵,另一个为一个数,返回与矩阵同维度的矩阵

2.4 stp 类

在stp类中重载了stp的加号、乘号、减号、相反数、转置以及点乘。

M=stp(A)

描述:stp类

输入参数:矩阵A

返回参量:STP类M

2.5 lm类

在这里我们将介绍逻辑矩阵或lm对象的函数。

lm类重载了加号、乘号和乘方运算

1.加号

输入:C=A+B,A,B为lm类

输出:C,lm类

2.乘号

输入:C=A*B,A,B为lm类

输出:C,lm类

3.乘方

输入:C=A^3,A为lm类

输出:C,lm类

下面介绍lm类中的内置函数,方便进行操作。

1.m=M:size()

描述:求lm类M的大小

输入:m=M:size(),M为lm类

输出:m为一个1*2的矩阵,第一个元素为行数,第二个元素为列数

2.m=M:length()

描述:求lm类M的长度

输入:m=M:length(),M为lm类

输出:m是一个数,为lm类的长度

3.m=M:unique()

描述:找出矩阵M的所有元素的种类,并且从小到大进行排序,例如 $$ M = \begin{bmatrix} 2&1\ 1&3 \end{bmatrix} $$ 则有 $$ m = \begin{bmatrix} 1&2&3 \end{bmatrix} $$

输入参数:lm类M

输出:m为lm类,m.v是一行向量,其中有矩阵A的所有元素的种类,并且按从小到大进行排序

4.m=M:rank()

描述:求lm类M的秩

输入:m=M:rank(),M为lm类

输出:m是lm类M的秩

5.m=M:trace()

描述:求lm类M的迹

输入:m=M:trace(),M为lm类且为方阵

输出:m是lm类M的迹

6.m=M:issquare()

描述:判断lm类M是否为方阵

输入:m=M:issquare(),M为lm类

输出:若是,则ture,若否,则false

7.M:display()

描述:输出lm类M

输入:M:display()

输出:lm类M的v和n

8.m=M:diag()

描述:输出lm类M的对角元素

输入:m=M:diag(),M为lm类,且为方阵

输出:m为1*n的向量(n为方阵的行数/列数),m中的元素为lm类M的对角元素

9.m=M:inv()

描述:求lm类M的逆

输入:m=M:inv(),M为lm类且为方阵

输出:lm类m

10.C=lmsetdiff(A,B)

描述:找出lm类A,B的差集

输入参数:lm类A,B

返回值:不同的元素

11.C=lmctimes(A,B)

描述:求lm类A和B的点乘

输入参数:A、B为lm类

返回值:lm类

12.C=lmeq(A,B)

描述:比较lm类A,B各元素,若相等,C相同位置元素为1;不相等,C相同位置元素为0

输入参数:A、B为lm类,且维度相同

返回值:C为一个矩阵,若A,B元素相等,C相同位置元素为1;不相等,C相同位置元素为0

2.6 其他基础函数介绍

下面介绍一些基础函数

  1. $M=newlm(A)$ 或者 $M=newlm(v,n)$

描述:lm类构造函数

输入参数:i)逻辑矩阵A;(ii)向量$v=[v_1,v_2,...,v_p]$,正整数n满足$0≤v_i≤n$, $1≤i≤p$.(情形i,参考定义1.4,例1.6;情形ii,newlm.n = n, newlm.v = v)

返回值:lm类 $M$

  1. $C=lsp(A,B)$

描述:该函数执行逻辑矩阵A和B的半张量积

输入参数:lm类A、B。(参考定义1.4和注1.5)

返回值:$C=A \ltimes B$ 是一个lm类

3.$C=lspn(A_1,A_2,...,A_n)$

描述:该函数执行逻辑矩阵$A_1,A_2,...,A_n$的半张量积。

输入参数:lm类$A_1,A_2,...,A_n$。(参考定义1.4和注1.5)

返回值:$C= \ltimes _{i=1}^n$ 是一个lm类

4.$leye(n)$

描述:该函数产生一个n×n的单位矩阵。

输入参数:正整数n。

返回值:lm类$M$

5.$M=lmn(k)$

描述:该函数产生k值逻辑(k≥2)的否定结构矩阵。

输入参数:k是可选的,默认k是2。

返回值:lm类$M$

6.$M=lmc(k)$

描述:该函数生成k值逻辑(k≥2)的合取结构矩阵。

输入参数:k是可选的,默认k是2。

返回值:lm类$M$

7.$M=lmd(k)$

描述:该函数生成k值逻辑(k≥2)的析取结构矩阵。

输入参数:k是可选的,默认k是2。

返回值:lm类$M$

8.$M=lmi(k)$

描述:该函数生成k值逻辑(k≥2)的蕴涵结构矩阵。

输入参数:k是可选的,默认k是2。

返回值:lm类$M$

9.$M=lme(k)$

描述:该函数生成k值逻辑(k≥2)的等价结构矩阵。

输入参数:k是可选的,默认k是2。

返回值:lm类$M$

10.$M=lmr(k)$

描述:该函数产生k值逻辑(k≥2)的减功率矩阵。

输入参数:k是可选的,默认k是2。

返回值:lm类$M$

11.$M=lmu(k)$

描述:该函数为k值逻辑(k≥2)生成哑矩阵,该哑矩阵M满足以下性质 $MXY=Y,{\forall}X,Y\in D_k$

输入参数:k是可选的,默认k是2。

返回值:lm类$M$

12.$M=lmrand(m,n)$

描述:该函数随机生成一个m×n逻辑矩阵。

输入参数:正整数m和n n是可选的,默认n是m。

返回值:lm类$M$

13.$M=lmij(m,n)$

描述:该函数产生一个mn×nn交换矩阵。

输入参数:正整数m和n n是可选的,默认n是m。

返回值:lm类$M$

14.$M=randlm(k)$

描述:lmrand的别名函数。

输入参数:正整数m和n n是可选的,默认n是m。

返回值:lm类$M$

3. STP工具箱的使用方法

3.1 Windows端使用方法

stplua文件夹和loadstp.lua文件复制到C:\Torch\lua文件夹下。

在cmd下, 输入 th,进入torch编译环境,之后运行以下命令

> require"loadstp"
> loadstp()

成功运行后即可使用stp工具箱的相关内容。

3.2 Linux端使用方法

stplua文件夹和loadstp.lua文件复制到linux的对应lua文件夹下,其他同windows端用法

About

semi-tensor product toolbox for lua language

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages