gpt4 book ai didi

Matlab子矩阵乘法性能差

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:48 28 4
gpt4 key购买 nike

在 matlab 中子矩阵的乘法似乎比从中提取子矩阵的乘法慢得多。

>> m = rand(1e7, 40);
>> tic; m' * m; toc % (1)
Elapsed time is 0.245803 seconds.
>> tic; m(1:2.5e6, :)' * m(1:2.5e6, :); toc % (2)
Elapsed time is 1.810981 seconds.
>> tic; t = m(1:2.5e6, :); t' * t; toc % (3)
Elapsed time is 0.885764 seconds.

我曾希望对此有一些快速的内置方法,因为数据已经在内存中,但似乎没有办法阻止 matlab 制作中间副本。 (3) 速度更快,但保证我们制作副本。

ma​​tlab 中是否有任何技术可以使对矩阵子集的运算(例如乘法、转置)与对整个矩阵的运算一样快?

唯一快速实现这一目标的方法是使用 mex 吗?

编辑:使用列主要数据可以全面加快速度(正如预期的那样),但在乘以子矩阵时仍然慢得多。

>> m = rand(40,1e7);
>> tic; m * m'; toc
Elapsed time is 0.251958 seconds.
>> tic; m(:, 1:2.5e6) * m(:, 1:2.5e6)'; toc
Elapsed time is 1.461321 seconds.
>> tic; s=m(:, 1:2.5e6); s * s'; toc
Elapsed time is 0.555667 seconds.

显然 matlab 在索引时进行了复制,但是有什么方法可以防止这种情况(很明显这种乘法算法可以在不复制数据的情况下存在,我只想知道它是否可以在 matlab 中表达)。

最佳答案

这里是更多的测试结果。

已经测试了执行矩阵乘法的五种方法,其中 3 种涉及子矩阵。正如@Cris 指出的那样,如果使用 rand(1e7,40) 可能会有所不同,因此测试了另一组。

已使用 10 次重复的循环和 Profiler 来提高准确性。在具有大量 RAM 的 i7 上测试。

测试代码

% clear;clc;close all

A = rand(1e7, 40);
for ii = 1:10
m = A;
m(end) = m(end-1);

m' * m; % 1

n = m';
n * m; % 2

m(1:2.5e6, :)' * m(1:2.5e6, :); % 3

t = m(1:2.5e6, :);
t' * t; % 4

t2 = t';
t2 * t; % 5

clearvars -except A
end
clearvars A
B = rand(40, 1e7);
for ii = 1:10
m = B;
m(end) = m(end-1);

m * m'; % 1

n = m';
m * n; % 2

m(:,1:2.5e6) * m(:,1:2.5e6)'; % 3

t = m(:,1:2.5e6);
t * t'; % 4

t2 = t';
t * t2; % 5

clearvars -except B
end

分析器结果

Total time for each method

Profiler screenshot

评论

  1. 任何小于 10% 的时间差异都被视为相同。
  2. 在每个循环的开始,矩阵被一个简单的赋值强制复制。复制速度很慢(11.5 秒)。
  3. 对于完整的矩阵,在 MxN 和 NxM 维度之间没有发现差异。但是对于子矩阵测试,40x2.5e6 显然更快。
  4. 缓冲转置会使整个过程减慢 100%。我认为这是因为 Matlab 失去了优化能力;可能如果键入 m'*m 它会识别模式并跳过转置操作。
  5. 子集然后转置未优化。
  6. 缓冲子集确实加快了乘法。

关于Matlab子矩阵乘法性能差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43081024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com