【问题标题】:Efficient operations of big non-sparse matrices in MatlabMatlab中大型非稀疏矩阵的高效运算
【发布时间】:2014-04-18 11:50:54
【问题描述】:

我需要在 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);

时间是:

【问题讨论】:

    标签: matlab matrix bigdata bsxfun


    【解决方案1】:

    为什么是repmat 而不是bsxfun

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

    您似乎正在用完 RAM,并且操作系统开始为非常大的矩阵分配交换空间。内存交换始终是一项非常耗时的操作,并且随着所需内存量的增加,它会变得更糟。
    我相信你正在见证thrashing

    【讨论】:

    • 谢谢。这正是我正在寻找的处理大型矩阵的方法。
    • bsxfun的文档中,我找到了单例扩展的解释:“只要A或B的维度是单例(等于一),bsxfun就会沿虚拟复制数组该维度以匹配另一个数组”。我其实不知道这个有用的功能。
    • @tashuhka bsxfun 非常有用。有关更多信息,请参阅其标签 wiki
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多