首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用matlab实现对向kronecker乘积的矢量化

用matlab实现对向kronecker乘积的矢量化
EN

Stack Overflow用户
提问于 2015-08-28 21:27:03
回答 2查看 694关注 0票数 4

假设有两个大小相同的矩阵,我想计算它们的列向克隆克积的总和。由于有时列的大小很大,所以速度可能很慢。因此,是否存在向量化函数,或者任何函数都可以帮助降低matlab中的复杂性?提前谢谢。

下面提供了具有for-循环的相应matlab代码,d的回答是感兴趣的输出:

代码语言:javascript
复制
A = rand(3,7);
B = rand(3,7);
d = zeros(size(A,1)*size(B,1),1);
for i=1:size(A,2)
    d = d + kron(A(:,i),B(:,i));
end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-30 00:56:16

使用丹尼尔斯答案给出的Kronecker积的重写

代码语言:javascript
复制
e=zeros(size(B,1),size(A,1));
for i=1:size(A,2)
    e = e + B(:,i)*A(:,i).';
end
e=reshape(e,[],1);

我们说

代码语言:javascript
复制
C = A'

因此

代码语言:javascript
复制
for i=1:m
    e = e + B(:,i)*C(i,:);
end

它是矩阵积的定义。

代码语言:javascript
复制
B*C.

总之,这个问题可以用简单的矩阵乘积来解决。

代码语言:javascript
复制
d = reshape(B*A',[],1);
票数 4
EN

Stack Overflow用户

发布于 2015-08-28 21:52:30

两个向量的kronecker积只是两个向量矩阵乘法的一个重塑结果:

代码语言:javascript
复制
e=zeros(size(B,1),size(A,1));
for i=1:size(A,2)
    e = e + B(:,i)*A(:,i).';
end
e=reshape(e,[],1);

现在知道它只是一个产品之和,可以使用bsxfun将其放入一行

代码语言:javascript
复制
f=reshape(sum(bsxfun(@times,permute(B,[1,3,2]),permute(A,[3,1,2])),3),[],1);

根据输入的不同,bsxfun比矩阵乘法略快一些,但这会带来较高的内存消耗。bsxfun解决方案使用O(size(A,1)*size(B,1)*size(B,2)),而for-循环除了输入参数外只使用O(size(A,1)*size(B,1))

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32280002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档