【问题标题】:Vectorize the pairwise kronecker product in matlab在matlab中向量化成对的克罗内克积
【发布时间】:2015-08-28 21:27:03
【问题描述】:

假设有两个大小相同的矩阵,我想计算它们的列式克罗内克积的总和。由于有时列大小非常大,因此速度可能会很慢。因此,无论如何要对这个函数进行矢量化,或者任何函数都可以帮助降低 matlab 的复杂性?提前致谢。

下面提供了对应的带有for循环的matlab代码,d的答案就是感兴趣的输出:

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

【问题讨论】:

  • 您可以通过点击帖子标签下方的小“编辑”标签来编辑您自己的问题,这可能比在 cmets 中添加信息更具可持续性。
  • 如果您将鼠标悬停在评论上方,您可以通过单击出现的小“x”图标来删除您的 cmets。这有时对于保持问题和答案没有垃圾很有用。我将在一段时间内删除此评论和我之前的评论,因为您的问题现在不需要它们。

标签: matlab math vector vectorization


【解决方案1】:

使用 Daniels 给出的 Kronecker 产品的重写答案

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);

我们这么说

C = A'

因此

for i=1:m
    e = e + B(:,i)*C(i,:);
end

这是矩阵乘积的定义

B*C.

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

d = reshape(B*A',[],1);

【讨论】:

    【解决方案2】:

    两个向量的克罗内克积只是两个向量矩阵相乘的重构结果:

    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将其放入一行中

    f=reshape(sum(bsxfun(@times,permute(B,[1,3,2]),permute(A,[3,1,2])),3),[],1);
    

    根据输入的不同,bsxfun-sulution 比矩阵乘法稍快,但会消耗大量内存。 bsxfun 解决方案使用O(size(A,1)*size(B,1)*size(B,2)),而 for 循环除了输入参数外仅使用O(size(A,1)*size(B,1))

    【讨论】:

    • 比起 bsxfun 可以简单地写成f=reshape(B*A',[],1);,这样会明显更快。
    • @Forss:那个问题的答案。你能把它写成答案吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2016-12-14
    • 2011-06-23
    • 2022-09-23
    相关资源
    最近更新 更多