【问题标题】:Converting matlab sparse matrix to single precision将matlab稀疏矩阵转换为单精度
【发布时间】:2017-03-01 06:22:59
【问题描述】:

我想将 matlab 中的稀疏矩阵转换为单精度,但是 matlab 似乎没有实现单稀疏。

而不是那样,我只是计划检查它的值是否超出单精度范围,并将它们四舍五入为单精度范围的最高和最低值。

我想做这样的事情:

for i = 1:rows
    for j = 1:cols
        if (abs(A(i,j) < 2^-126))
            A(i,j) == 0;
        end
    end
end

但是,这非常慢。我可以使用另一个命令来处理 MATLAB 中的稀疏矩阵类类型吗?我注意到大多数命令不适用于稀疏数据类型。

编辑 1:

我也尝试了以下方法,但正如您所见,我的内存不足(矩阵是稀疏的,大小为 200K x 200K,约 300 万个非零):

A(A < 2^-126) = 0
Error using  < 
Out of memory. Type HELP MEMORY for your options.

编辑 2:

我根据@rahnema1 的输入开发的当前解决方案:

% Convert entries that aren't in single precision
idx = find(A); % find locations of nonzeros
idx2 = find(abs(A(idx)) < double(realmin('single')));
A(idx(idx2)) = sign(A(idx(idx2)))*double(realmin('single'));
idx3 = find(abs(Problem.A(idx)) > double(realmax('single')));
A(idx(idx3)) = sign(A(idx(idx3)))*double(realmax('single'));

【问题讨论】:

标签: matlab matrix sparse-matrix


【解决方案1】:

您可以找到非零元素的索引并使用它来更改矩阵;

idx = find(A);
Anz = A(idx);
idx = idx(Anz < 2^-126);
A(idx) = 0;

或更紧凑:

idx = find(A);
A(idx(A(idx) < 2^-126)) = 0;

但是,如果您想从双精度转换为单精度,您可以使用 single 函数:

idx = find(A); 
A(idx) = double(single(full(A(idx))));

A(find(A)) = double(single(nonzeros(A)));

要将Inf 转换为realmax,您可以这样写:

A(find(A)) = double(max(-realmax('single'),min(realmax('single'),single(nonzeros(A)))));

如果您只想将 Inf 转换为 realmax,您可以这样做:

Anz = nonzeros(A);
AInf = isinf(A);
Anz(AInf) = double(realmax('single')) * sign(Anz(AInf));
A(find(A)) = Anz;

【讨论】:

  • 我正在尝试做这样的事情:idx = find(A); A(idx(abs(A(idx))
  • 如果您想将双精度转换为单精度,您尝试过idx = find(A); A(idx) = single(A(idx)); 吗?
  • 是的,该命令的结果如下: Error using single Attempt to convert to unimplemented sparse type
  • 是的。也见我的回答。我不喜欢大于 realmax('single') 的值如何转换为无穷大,然后它们在任何计算中基本上都无法使用,这对我来说不是我想要的
【解决方案2】:

当人们对如何将稀疏转换为单一感兴趣时仍然会到达此线程:一个简单的答案是使用full()。但是,如果您依赖 sparse 为您提供的内存节省,这可能会出现问题,因为它基本上会先转换为 double。

sparseMatrix = sparse(ones(2, 'double'));
single(full(sparseMatrix)) % works
% ans =
%  2×2 single matrix
%     1     1
%     1     1
single(sparseMatrix) % doesn't work
% Error using single
% Attempt to convert to unimplemented sparse type

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 2023-04-10
    • 2021-11-25
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2020-12-07
    相关资源
    最近更新 更多