矩阵的半张量积(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
定义1.2 给定两个矩阵$A \in M_{m \times n}$,$B \in M_{p \times q}$.A与B的(左)半张量积,记成$A \ltimes B$,定义为
定义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} $$
STP工具箱(lua语言)可以更加方便地使用torch来计算矩阵的半张量积。
同时,为方便进行数学运算,我们将一些常用的数学运算及矩阵运算编写成函数,方便程序进行调用。
gcd
-- 计算两个数的最大公约数 调用格式:gcd(a,b)
lcm
-- 计算两个数的最小公倍数 调用格式:lcm(a,b)
log2
-- 计算以2为底的x的对数 调用格式:log2(x)
det -- 计算矩阵的行列式 调用格式:det(A)
,其中A为方阵
rank -- 计算矩阵的秩 调用格式:rank(A)
,其中A为方阵
$C=sp(A,B)$
描述:矩阵A和矩阵B的(左)半张量积(根据定义1.1)
输入参数:两个任意尺寸的矩阵A和B
返回值:$C = A \ltimes B$
$C=sp1(A,B)$
描述:矩阵A和矩阵B的(左)半张量积(根据定义1.2)
输入参数:两个任意尺寸的矩阵A和B
返回值:$C = A \ltimes B$
(注意:sp和sp1在功能上是相同的。因为它们在内部使用不同的算法,所以在多维条件下,sp1应该比sp更快。)
$C=spn(A_1,A_2,...,A_n)$
描述:计算有限矩阵集$A_1,...,A_n$半张量积
输入参数:任意尺寸的矩阵集A_1,...,A_n
返回值:$C = \ltimes_{i=1}^{n}A_{i}$
$B=bt(A,p,r)$
描述:计算矩阵A的分块转置(定义1.10)
输入参数:A是要转置的矩阵,固定块的大小为p×r.
返回值:$B = A^{T(p,r)}$.
$W =wij(m,n)$
描述:该函数产生一个$mn \times mn $交换矩阵(定义1.7)
输入参数:两个正整数m和n. n是可选的,默认n是m.
返回值:维数为$mn \times mn $的矩阵W.
$v=vc(A)$
描述:该函数将矩阵转换为其列叠加形式
输入参数:矩阵$A=(a_{ij})_{m \times n}$.
返回值:$v= [a_{11} ... a_{m1} ... a_{1n} ... a_{mn}]^T$
$v= vr(A)$
描述:该函数将矩阵转换为其行叠加形式
输入参数:矩阵$A=(a_{ij})_{m \times n}$.
返回值:$v= [a_{11} ... a_{1n} ... a_{m1} ... a_{mn}]^T$
- 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。
- 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。
- v=dec2any(a,k,len)
描述:该函数将十进制数a转换为k进制的数
输入参数:a是正整数,k是可选的,k≥2。默认k为2。默认len为0,表示为$a_s\neq0$,但如果len>0且len>s+1,则len-s-1个零应加在返回值的开头。
返回值:
$det1=det(A)$
描述:求矩阵A的行列式。
输入参数:矩阵A为方阵。
返回值:det1 为矩阵A的行列式的值,det1为非负数。
$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
$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
$x=isempty(a)$
描述:判断lm类a是否为空,如果为空,返回1,否则返回0
输入参数:a为lm类
返回值:如果lm类为空,返回1,否则返回0
$rank1=rank(A)$
描述:求矩阵A的秩
输入参数:任一矩阵A
返回值:返回矩阵A的秩
$B=sum(A)$
描述:如果A为矩阵,则求矩阵A每一列元素的和;如果A为向量,则求向量A所有元素的和
输入参数:A为矩阵或向量
返回值:若A为矩阵,则返回值B为行向量,每个元素为矩阵A每一列元素的和;若A为向量,则返回值B为一数值,即向量A所有元素的和
$A=bubble(B)$
描述:对向量B中各个元素由小到大进行排序
输入参数:B为任一向量
返回值:返回对B由小到大进行排序的向量A
$B=unique(A)$
描述:找出矩阵A的所有元素的种类,并且从小到大进行排序,例如 $$ A = \begin{bmatrix} 2&1\ 1&3 \end{bmatrix} $$ 则有 $$ B = \begin{bmatrix} 1&2&3 \end{bmatrix} $$ 输入参数:任一矩阵A
返回值:返回值B为一行向量,其中有矩阵A的所有元素的种类,并且按从小到大进行排序
$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中没有的值,结果向量将以升序排序返回
$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其中一个为矩阵,另一个为一个数,返回与矩阵同维度的矩阵
在stp类中重载了stp的加号、乘号、减号、相反数、转置以及点乘。
M=stp(A)
描述:stp类
输入参数:矩阵A
返回参量:STP类M
在这里我们将介绍逻辑矩阵或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
下面介绍一些基础函数
-
$M=newlm(A)$ 或者$M=newlm(v,n)$
描述:lm类构造函数
输入参数:i)逻辑矩阵A;(ii)向量$v=[v_1,v_2,...,v_p]$,正整数n满足$0≤v_i≤n$,
返回值:lm类
$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满足以下性质
输入参数: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$
将stplua
文件夹和loadstp.lua
文件复制到C:\Torch\lua
文件夹下。
在cmd下, 输入 th
,进入torch编译环境,之后运行以下命令
> require"loadstp"
> loadstp()
成功运行后即可使用stp工具箱的相关内容。
将stplua
文件夹和loadstp.lua
文件复制到linux的对应lua文件夹下,其他同windows端用法