我需要在 Matlab 中操作大的 3-dim 非稀疏矩阵。使用纯矢量化会产生较长的计算时间。因此,我尝试将操作拆分为 10 个块,然后解析结果。当我看到纯矢量化并不能很好地适应下图中显示的数据大小时,我感到很惊讶。
我包括了这两种方法的一个例子。
% 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);
时间是: