【问题标题】:Multiplying a 4D matrix by a vector, and collapsing 1 dimension将 4D 矩阵乘以向量,并折叠 1 维
【发布时间】:2018-10-17 18:51:43
【问题描述】:

我有一个关于 4 维对象乘以 1 维对象的问题。 实际上,我有一个大小为 (15,15,3,5) 的 4D 对象。 我想通过使用 5x1 向量来乘以第 4 维,将最后一个维度折叠为 1。然后我想使用挤压来获得 (15,15,3) 大小的对象,再次将其乘以 3x1 向量,留下我使用 15x15 矩阵。

我可以循环执行此操作,但这非常昂贵。谁能给我建议如何在没有循环的情况下做到这一点?

现在循环:

expectationCalc = reshape(mValueFunction(age+1, :, :, :, :), nGridAssets, nGridHumanCapital, nNetInterestRate, nShockstoHumanCapital);
for i = 1:nGridAssets
    for j = 1:nGridHumanCapital
        expectation(i,j) = mTransitionNetInterestRate(nNetIntRate, :)*(squeeze(expectationCalc(i,j,:,:))*mTransitionShockHumanCapital(ShockHcapital, :)');
    end
end 

【问题讨论】:

  • 您可以通过预分配 expectation 并在内部循环中循环第一个维度 (i) 来加速循环。

标签: matlab matrix matrix-multiplication


【解决方案1】:

如果您将 4D 矩阵重塑为 2D 矩阵,其中第 2 维是您要通过点积减少的维度,第 1 维包含所有其他维度,那么您可以应用常规矩阵乘法。然后可以将结果重新整形为原始大小(减一维):

% Input data
M = randn(15,15,3,5);
v1 = randn(5,1);
v2 = randn(3,1);

% 1st multiplication
sz = size(M);
M = reshape(M,[],sz(end));
M = M * v1;
sz(end) = [];       % We no longer have that last dimension
M = reshape(M,sz);

% 2nd multiplication
M = reshape(M,[],sz(end));
M = M * v2;
sz(end) = [];       % We no longer have that last dimension
M = reshape(M,sz);

【讨论】:

  • 我试过这个,但它似乎是一个更长的过程。
  • @DickOosthuizen:比什么长?这不可能比问题中的循环代码慢。 MATLAB 使用了高度优化的* 运算符,整形本质上是免费的(这里没有复制数据)。
  • 如果你愿意,你可以在第一次乘法结束时移除重塑,但它不会花费太多。我只是做了一些计时:你的双循环 = 1.2ms,我的代码 = 0.011ms。
  • 我又试了一次。你是对的。我的代码时间显着下降。总共从 22 秒到 4 秒。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多