使用MATLAB快速计算Khatri-Rao积
Khatri-Rao积介绍
方法介绍
若采用循环的方式逐列计算Kronecker积,当矩阵的列数较多时(比如上百万列),需要调用相同次数的kron函数,耗时较多。借助MATLAB在矩阵运算的优势,我们采用矩阵运算取代循环,以此减少计算时间。
考虑如下的计算:
快读计算Khatri-Rao积的方法如下:
第一步:对F、G矩阵进行如下图所示的操作,将F矩阵的每行复制G矩阵的行数,以下图为例,将F的每行复制2份,并照原来的顺序排列组合成更高阶的矩阵;将矩阵G复制K份,K是F的行数,以下图为例,将矩阵G复制三份,组合成更高阶的矩阵。
第二步:之后将两个扩充后的高阶的矩阵做Hadamard积,计算如下:
根据结果比较,以上计算Khatri-Rao积的方法是正确的。
代码
第一步的代码实现如下:
nR_F=size(F,1); %F的行数
nR_G=size(G,1); %G的行数
mul=ones(nR_G,1);
FF=kron(F,mul); %通过kron函数实现对F矩阵的扩充,得到FF矩阵
GG=repmat(G,nR_F,1);%通过repmat函数实现对G矩阵的扩充,得到GG矩阵
第二步的代码实现如下:
kr=FF.*GG;
整个算法的代码:
function kr=KR(F,G)
nR_F=size(F,1); %F的行数
nR_G=size(G,1); %G的行数
mul=ones(nR_G,1);
FF=kron(F,mul); %通过kron函数实现对F矩阵的扩充,得到FF矩阵
GG=repmat(G,nR_F,1);%通过repmat函数实现对G矩阵的扩充,得到GG矩阵
kr=FF.*GG;
end
结果验证
其中kr1函数是采用上述的方法,kr2函数采用了按列循环的方法。
计算结果如下图所示,结果正确。
接下来比较两种计算方法的用时,假设F=G是3×100000的矩阵,分别采用两种方法Khatri-Rao积,计算结果如下图所示,采用本文的矩阵计算方法明显快于按列循环的方法。
继续增加矩阵的列数,当F=G是3×1500000的矩阵,计算结果如下图所示,两种方法的计算速度差异更加明显。
总结
考虑到MATLAB更加适合矩阵运算,本文给出了一种快速计算两个矩阵Khatri-Rao积的方法,计算时间较普通的循环方法大幅缩减。