【问题标题】:fPerformance of outer product in matlabmatlab中外积的表现
【发布时间】:2015-02-03 18:53:55
【问题描述】:

我有两个向量,比如 A:1xN 和 B:1xM。我想计算它们的外积并将结果添加到 NxM 矩阵中。现在,我把它分成两部分,首先计算 (A')B 然后添加它。在分析时,第一步比添加(8x)花费更多的时间。由于第一步中的乘法次数与第二步中的加法次数相同,所以差异仅仅是因为我的架构支持更快的加法吗?还是第一步分配内存用于存储结果所花费的时间?

>> x = randn(1,10000);
>> y = randn(1,10000);
>> tic; z=x'*y; toc;
Elapsed time is 0.560743 seconds.
>> tic; z=z+z; toc;
Elapsed time is 0.132228 seconds.
>> tic; z=z.*z; toc;
Elapsed time is 0.124191 seconds.

所以我认为这不是多对加。 z = z+z 和 z = z.*z 的时间相似。

【问题讨论】:

  • 显示您的代码并解释它们的时间安排?
  • 浮点值相乘比相加需要更多时间。您看到的行为可能是正常的
  • 好吧,在编辑中,似乎并非如此。它可能在某些架构中,但不是在这里。
  • 那么问题到底是什么?
  • @user3287648 我现在无法在 MATLAB 中对此进行测试,但内存分配可能会导致这种差异。在运行z=x'*y 之前尝试将z 初始化为一个零矩阵;看看运行时间是否保持不变。此外,tic/toc 不是分析代码的可靠方法。见stackoverflow.com/a/18955502/2541573

标签: performance matlab architecture product allocation


【解决方案1】:

使用两个矩阵和外积之间有很多不同之处。如果您考虑自己的“C”实现并将它们进行比较,就会变得很明显。

  1. 外部产品可能需要多个索引来跟踪您从向量中读取的位置以及在矩阵中写入的位置。即更多的循环开销。
  2. 如果要与相同的矩阵相加或相乘,则循环只需要一个索引。
  3. 第二个和第三个操作也是就地操作,需要更少的内存指针。

【讨论】:

  • 我同意这两个索引,但这不会增加太多开销。我没有得到第三点。读写不一样吗?
  • 地址指针数量较少。我更新了句子。你是对的,写入次数是相同的。但是第一个读取的次数更多,因为它正在读取两个变量。
  • 虽然是读取两个变量,但总读取数不需要更多。他们实际上会小于说 z = A.* B wjere A 和 B 是与外积结果相同维度的完整矩阵。
猜你喜欢
  • 2021-11-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2019-07-12
  • 2015-08-03
  • 2023-04-08
相关资源
最近更新 更多