在 Matlab 中,如何使用 formatSpec 格式化运算符指定指数中的位数?
Posted
技术标签:
【中文标题】在 Matlab 中,如何使用 formatSpec 格式化运算符指定指数中的位数?【英文标题】:In Matlab, how to specify number of digits in the exponent using formatSpec formatting operator? 【发布时间】:2018-01-23 11:56:29 【问题描述】:我正在使用 Matlab 中的fprintf
命令将数据写入输出文本文件。如何将一个数字写入输出文件,例如1.12345678e-001
,指数中的三位数字?
formatSpec = '%1.8e\n';
给出1.12345678e-01
,而不是想要的结果!
这里有一个类似的问题 https://se.mathworks.com/matlabcentral/answers/100772-how-do-i-use-fprintf-to-write-numbers-in-exponential-notation-of-variable-exponent-digits-on-a-windo
但是按照那里给出的说明并没有解决问题!
【问题讨论】:
【参考方案1】:您可以使用这种非正则表达式方法:
num = 0.112345678
pow = floor(log10(abs(num)));
sprintf('%.8fe%+.3d', num/10^pow, pow)
ans =
1.12345678e-001
对于多个输入,请使用:
num= [.123 .456 .789];
pow = floor(log10(abs(num)));
sprintf('%.8fe%+.3d ', [num./10.^pow; pow])
【讨论】:
不错。我比我更喜欢这个解决方案。 @rahnema1 可能是个小问题,如果num= [.123; .456; .789];
我如何将输出数据格式化为行而不是列?我有多个双数据类型的一列数组,例如x = [-0.00912036467;-0.00838289689;-0.0106730480;-0.0115961293;-0.00669082161;...]
需要改成x = [-9.12036467e-003; -8.38289689e-003; -1.06730480e-002; -1.15961293e-002; -6.69082161e-003;...]
的格式
@Emma 您可以只修改最后一行以添加新行而不是空格sprintf('%.8fe%+.3d\n', [num./10.^pow; pow])
@Emma 抱歉回复晚了。 Sice 数组是一个列向量,您应该首先对其进行转置。正如 AeroEngy 指出的那样,您可以使用 \n
而不是空格。 x = x.';pow = floor(log10(abs(x)));sprintf('%.8fe%+.3d\n', [x ./ 10 .^pow; pow]);
无需循环。这应该工作:num= [.123; .456; .789];num = num.';pow = floor(log10(abs(num)));fprintf(fileIDout,'%.8fe%+.3d\n', [num./10 .^pow; pow])
【参考方案2】:
不确定这是否属于解决方案或解决方法的类别,但这里是:
x = .123e25; % example number
formatSpec = '%1.8e\n'; % format specification
s = sprintf(formatSpec, x); % "normal" sprintf
pat = '(?<=e)[+-]\d+'; % regex pattern to detect exponent
s = regexprep(s, pat, sprintf('%+04i', str2double(regexp(s, pat ,'match')))); % zero-pad
它使用正则表达式来识别指数子字符串并将其替换为指数零填充到三位数字。正指数包括一个加号,如fprintf
。
【讨论】:
【参考方案3】:这不是最干净的答案,但您可以这样做。基本步骤是按原样编写,使用正则表达式获取指数,重写该部分并替换。
formatSpec = '%1.8e'
tempStr = sprintf(formatSpec,1.12345678e-1);
oldExp = regexp(tempStr,'e[+-]([0-9]+)$','tokens');
newExp = num2str(str2double(oldExp11),'%03d');
fixedStr = regexprep(tempStr,[oldExp11 '$'],newExp)
这个输出:
fixedStr =
1.12345678e-001
【讨论】:
嗯,它可能比我的更干净:-P @LuisMendo 我开始做类似你的事情,但是正则表达式中的嵌套正则表达式杀死了我。我确实喜欢您使用“匹配”和 `(?以上是关于在 Matlab 中,如何使用 formatSpec 格式化运算符指定指数中的位数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Linux 终端中使用 MCR(Matlab 编译器运行时)运行 Matlab 文件?
MATLAB | 如何在MATLAB中使用python全部colormap配色