使用MATLAB快速计算Khatri-Rao积

使用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函数采用了按列循环的方法
其中kr1函数是采用上述的方法,kr2函数采用了按列循环的方法。

计算结果如下图所示,结果正确。
在这里插入图片描述

接下来比较两种计算方法的用时,假设F=G是3×100000的矩阵,分别采用两种方法Khatri-Rao积,计算结果如下图所示,采用本文的矩阵计算方法明显快于按列循环的方法。
在这里插入图片描述

继续增加矩阵的列数,当F=G是3×1500000的矩阵,计算结果如下图所示,两种方法的计算速度差异更加明显。

在这里插入图片描述

总结

考虑到MATLAB更加适合矩阵运算,本文给出了一种快速计算两个矩阵Khatri-Rao积的方法,计算时间较普通的循环方法大幅缩减。

  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值