在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) 更快,但保证我们制作一个副本。
在Matlab中是否有任何技术可以使操作(例如乘法,转置)在矩阵子集上像整个矩阵一样快?
唯一快速实现这一点的方法是使用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中表达)。
a = b
)时才能共享。也许如果子数组在内存中是连续的,也可以共享,但我从未尝试过。否则,索引总是会导致复制。请注意,您的索引涵盖了m
的非连续区域。您是否尝试过使用m = rand(40,1e7)
和t = m(:,1:2.5e6)
进行操作? - Cris Luengo