【问题标题】:Multiplication of each slice of a 3D matrix with 2D matrix [duplicate]将 3D 矩阵的每个切片与 2D 矩阵相乘
【发布时间】:2018-07-09 05:37:54
【问题描述】:

我尝试在我的工作中使用svd,它将返回如下向量。

A=rand(10,5);
b=rand(10,5,100);
[U, S , V]=svd(A);

我要做的是将b 的每个切片与U 相乘。对于一个特定的切片,此操作是有效的:

c=U'*b(:,:,1);

但是,当我尝试使用如下矢量化方法时,它会返回数组尺寸不匹配错误。

Utran=U.';
c = cellfun(@(x) x.*b,num2cell(Utran,[1 2]),'UniformOutput',false);

第一种方法我可能会使用循环,但如果我有一个大矩阵,它就没有效率。知道我的错误是什么吗?

【问题讨论】:

  • 这可以通过一个简单的 for 循环来解决。为什么不呢?
  • 嗯,这 100 个切片只是一个例子,在现实世界中我处理的切片超过 50K。所以为了将来的证明,我可能想开始矢量化我的代码:)
  • 矢量化 != 快。 MATLAB 的 JIT 编译器非常好,通常 for 循环也同样快。
  • 好的,但由于矢量化代码不起作用,我无法比较并做出决定
  • @GregorIsack “过早的优化是万恶之源”-Donald Knuth。为什么要优化一段您不知道它是否对您的应用程序至关重要的代码?

标签: matlab multidimensional-array


【解决方案1】:

以下是矢量化解决方案。

不确定它是否比使用循环更快;即使是,请注意它使用更多内存进行中间计算:

result = permute(sum(permute(conj(U), [1 3 4 2]).*b), [4 2 3 1]);

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多