代码之家  ›  专栏  ›  技术社区  ›  ggkmath

matlab:有没有一种方法可以加速计算数字的符号?

  •  3
  • ggkmath  · 技术社区  · 14 年前

    当数组的大小很大时,我程序中的瓶颈是为数组中的所有数字计算一个数字的符号。我在下面展示了我尝试过的两种方法,都有相似的结果。我有16GB的内存,阵列占用了~5GB。我看到的问题是符号函数占用了大量的RAM+虚拟内存。有人知道如何减少内存需求并加快将数组输入符号放入数组输出的过程吗(见下文)?

    在if或switch命令中使用for循环不会耗尽内存,但需要一个小时才能完成(太长时间)。

    size = 1e9; % size of large array (just an example, could be larger)
    output = int8(zeros(size,1)-1); % preallocate to -1
    input = single(rand(size,1));   % create random array between 0 and 1
    scalar = single(0.5); % just a scalar number, set to 0.5 (midpoint) for example
    
    % approach 1 (comment out when using approach 2)
    output = int8(sign(input - scalar));  % this line of code uses a ton of RAM and virtual memory
    
    % approach 2
    output(input>scalar) = 1;            % this line of code uses a ton of RAM and virtual memory
    output(input==scalar) = 0;           % this line of code uses a ton of RAM and virtual memory
    

    提前谢谢你的建议。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Ray    14 年前

    chunkSize = 1e7;
    for start=1:chunkSize:size
        stop = min(start+chunkSize, size);
        output(start:stop) = int8(sign(input(start:stop)-scalar));
    end
    

    input = rand(size, 1, 'single');
    output = zeros(size, 1, 'int8') - 1;
    
        2
  •  1
  •   Jonas    14 年前

    sign

    output

    siz = 1e9; %# do not use 'size' as a variable, since it's an important function
    input = rand(siz,1,'single'); %# this directly creates a single array
    scalar = single(0.5);
    output = input>scalar;
    

    编辑 实际上,即使对于这个解决方案,我也看到了内存使用的短暂高峰。也许这与多线程有关?不管怎样,速度问题来自于您开始分页的事实,这会使所有操作都变慢。