0

我正在编写一个函数,该函数需要将浮点值转换为要传递到(关闭的)C 代码中的字符串。字符串转换是我的代码中最慢的部分,输入数组可能非常大。sprintf速度很快,并且g转换字符导致紧凑的表示:

x = [-1.75 0 1 pi 2^57];
sprintf('%.17g ',x)

返回

-1.75 0 1 3.1415926535897931 1.4411518807585587e+17 

sprintf's C 等效项一样,在指定或转换字符时不会打印无意义的零。但是,我使用的 C 代码要求数值包括小数点和尾随零。保持相同精度的另一个选项是:gG

x = [-1.75 0 1 pi 2^57];
sprintf('%.17f ',x)

返回

-1.75000000000000000 0.00000000000000000 1.00000000000000000 3.14159265358979312 144115188075855872.00000000000000000

但这会导致字符串数组膨胀(输入向量可能很大且具有复值)。


如何有效且紧凑地(速度和内存)将我的数字打印到字符串,同时在需要时添加尾随零并产生这样的输出?

-1.75 0.0 1.0 3.1415926535897931 1.4411518807585587e+17

理想情况下,这可以直接在格式字符串中完成,以便sprintf可以完成工作。如果这不起作用,还有哪些其他选择,最快的是什么?regexprep太慢了所以别想了。如果您愿意,您可以将x = repmat([-1.75 0 1 pi 2^57],1e5,1);其用作测试阵列以用于计时目的。

4

1 回答 1

1

首先,我定义了我想要使用的格式规范。
然后我确定哪个是合适的并创建格式规范字符串。

x = [-1.75 0 1 pi 2^57];

s = {'%.17g ', '%.1f'};
idx = (x-floor(x) < 0.1 & x < 10^9) + 1;
fspec = reshape(char(s(idx))', 1, []);

给我

>> sprintf(fspec, x)

ans =

-1.75 0.0  1.0  3.1415926535897931 1.4411518807585587e+17 
于 2013-11-13T01:47:20.720 回答