我想将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'));
答案 0 :(得分:0)
您可以找到非零元素的索引并使用它来更改矩阵;
idx = find(A);
Anz = A(idx);
idx = idx(Anz < 2^-126);
A(idx) = 0;
或更紧凑:
idx = find(A);
A(idx(A(idx) < 2^-126)) = 0;
但是,如果您想要从double转换为single,可以使用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;