Matlab中大型非稀疏矩阵的高效运算

时间:2014-03-13 15:46:14

标签: matlab matrix bigdata bsxfun

我需要在Matlab中使用大三维非稀疏矩阵。使用纯矢量化可以提供高计算时间。所以,我试图将操作拆分为10个块,然后解析结果。 当我看到纯矢量化不能很好地扩展数据大小时,我感到很惊讶。如下图所示。

enter image description here

我列举了两种方法的例子。

% Parameters:
M = 1e6;  N = 50;  L = 4;  K = 10;

% Method 1: Pure vectorization
mat1 = randi(L,[M,N,L]);
mat2 = repmat(permute(1:L,[3 1 2]),M,N);
result1 = nnz(mat1>mat2)./(M+N+L);

% Method 2: Split computations
result2 = 0;
for ii=1:K
    mat1 = randi(L,[M/K,N,L]);
    mat2 = repmat(permute(1:L,[3 1 2]),M/K,N);
    result2 = result2 + nnz(mat1>mat2);
end
result2 = result2/(M+N+L);

因此,我想知道是否有任何其他方法可以使Matlab中的大矩阵运算更有效。我知道这是一个相当广泛的问题,但我会承担风险:)


编辑:

使用@Shai的实现

% Method 3
mat3 = randi(L,[M,N,L]);
result3 = nnz(bsxfun( @gt, mat3, permute( 1:L, [3 1 2] ) ))./(M+N+L);

时间是:

enter image description here

1 个答案:

答案 0 :(得分:3)

为什么repmat而不是bsxfun

result = nnz(bsxfun( @gt, mat1, permute( 1:L, [3 1 2] ) ))./(M+N+L);

好像你正在耗尽你的RAM并且操作系统开始为非常大的matrics分配交换空间。内存交换总是非常耗时的操作,随着您需要的内存量的增加,内存交换会变得更糟 我相信你正在见证thrashing