Octave/MATLAB 中的快速矩阵求和?
fast matrix sum in Octave/MATLAB?
我有一个潜在的八度矩阵,比方说
N = 1e6; my_matrix = rand(1e3, N);
和列索引列表:
column_indices = randsample(N,N/2);
正是我想要的
sum(my_matrix(:, column_indices), 2);
但是对于大 N 来说这可能会很慢(在我的 PC 上 3 秒,RAM 中有一个大碰撞)。 Octave/MATLAB先计算my_matrix(:, column_indices)
,需要时间和内存,然后求和。八度可以更快地做到这一点吗? (也许通过避免创建矩阵 my_matrix(:, column_indices)
?)
我知道您正在寻找 Octave 中的快速解决方案。我这里没有 Octave 可以测试,但是对于 MATLAB,循环要快得多:
function res = sumcols(mat, column_indices)
res = mat(:,column_indices(1));
for ii = 2:numel(column_indices)
res = res + mat(:, column_indices(ii));
end
我用比你的例子小一点的数组测试了它:
N = 1e5; my_matrix = rand(1e3, N);
column_indices = randi(N, N/2, 1);
timeit(@()sum(my_matrix(:, column_indices), 2)) % 0.2697 s
timeit(@()sumcols(my_matrix, column_indices)) % 0.0446 s
对于这个大小的数组,循环快 6 倍。
我们还可以对列索引进行排序:
timeit(@()sum(my_matrix(:, sort(column_indices)), 2)) % 0.2623 s
这会稍微改变输出(浮点舍入误差会通过改变求和顺序而改变),但也会稍微加快计算速度,因为我们正在以正确的顺序访问数据。
在 Octave 上,所有这些时间安排都会非常不同。 sort
可能对您的输出有更大的影响,并且循环可能会减慢速度而不是加快速度。请测试并与我们分享您的结果!
可以使用矩阵乘法:
column_indices = randsample(N,N/2);
idx = zeros(N,1);
idx(column_indices) = 1;
result = my_matrix * idx;
这里每一行都乘以一个二元向量而不创建一个临时的巨大矩阵。
我有一个潜在的八度矩阵,比方说
N = 1e6; my_matrix = rand(1e3, N);
和列索引列表:
column_indices = randsample(N,N/2);
正是我想要的
sum(my_matrix(:, column_indices), 2);
但是对于大 N 来说这可能会很慢(在我的 PC 上 3 秒,RAM 中有一个大碰撞)。 Octave/MATLAB先计算my_matrix(:, column_indices)
,需要时间和内存,然后求和。八度可以更快地做到这一点吗? (也许通过避免创建矩阵 my_matrix(:, column_indices)
?)
我知道您正在寻找 Octave 中的快速解决方案。我这里没有 Octave 可以测试,但是对于 MATLAB,循环要快得多:
function res = sumcols(mat, column_indices)
res = mat(:,column_indices(1));
for ii = 2:numel(column_indices)
res = res + mat(:, column_indices(ii));
end
我用比你的例子小一点的数组测试了它:
N = 1e5; my_matrix = rand(1e3, N);
column_indices = randi(N, N/2, 1);
timeit(@()sum(my_matrix(:, column_indices), 2)) % 0.2697 s
timeit(@()sumcols(my_matrix, column_indices)) % 0.0446 s
对于这个大小的数组,循环快 6 倍。
我们还可以对列索引进行排序:
timeit(@()sum(my_matrix(:, sort(column_indices)), 2)) % 0.2623 s
这会稍微改变输出(浮点舍入误差会通过改变求和顺序而改变),但也会稍微加快计算速度,因为我们正在以正确的顺序访问数据。
在 Octave 上,所有这些时间安排都会非常不同。 sort
可能对您的输出有更大的影响,并且循环可能会减慢速度而不是加快速度。请测试并与我们分享您的结果!
可以使用矩阵乘法:
column_indices = randsample(N,N/2);
idx = zeros(N,1);
idx(column_indices) = 1;
result = my_matrix * idx;
这里每一行都乘以一个二元向量而不创建一个临时的巨大矩阵。