Jor*_*uin 5 matlab number-formatting
我正在 Matlab 中为特定的 CFD 代码编写网格平滑器。对网格数据文件的要求非常严格,因此数字格式必须非常具体。一个四边形单元的定义如下(其中第二行是 x 坐标,第三行是 y 坐标)。
ELEMENT 14 [ 1Q] GROUP 0
5.000000 10.00000 10.00000 5.000000
2.000000 2.000000 4.500000 4.500000
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,每个数字正好占用 8 个字符。一旦整个网格体通过我的平滑器,我需要将数字写回到文件中。我最接近这种数字格式的是使用以下运算符:
%#7.7克
我认为我不能使用 %f,因为它指定小数点后的位数,在我的情况下会有所不同(我的坐标从小于 1 到超过 100)。该运算符给我带来的唯一问题是,当我的数字小于 1 时,它只保留 7 个字符,并且数字最终为 9 个字符长;例如:
0.9313373
有谁知道正确的操作员,或者有解决方法吗?非常感激。
这是我能想到的唯一解决方法:
A = [1.12341234 .12341234 20.12341234 5 10];
% Create a precision mask
maxwidth = 8; % Max width, characters
mask = maxwidth(ones(size(A))) - 1; % Initialize mask, account for decimal
mask(A < 1) = maxwidth - 2;
% Stack the vectors and weave them
temp = [mask(:)';A(:)'];
temp = temp(:);
test = sprintf('%#7.*g ', temp);
Run Code Online (Sandbox Code Playgroud)
返回:
test =
1.123412 0.123412 20.12341 5.000000 10.00000
Run Code Online (Sandbox Code Playgroud)
这是一个烦人的额外步骤,但我们可以利用sprintf带星号的能力来引用输入列表中的参数。由于我的sprintf调用和测试用例的设置方式,我将掩码和数据编织在一起,因此sprintf可以看到精度说明符和数据交替出现。该temp(:)调用不是必需的,如果您将原始temp矩阵传递给sprintf它,它会执行相同的操作,因为它读取数据列优先。我添加了它,以便行为更加明确。
如何制定sprintf实际打印例程的调用将取决于您正在做什么,但这至少应该对您有所帮助。
Edit1:扩展一下,上面所做的相当于:
a = sprintf('%#7.*g ', temp(1), temp(2));
b = sprintf('%#7.*g ', temp(3), temp(4));
c = sprintf('%#7.*g ', temp(5), temp(6));
d = sprintf('%#7.*g ', temp(7), temp(8));
e = sprintf('%#7.*g ', temp(9), temp(10));
test = [a b c d e];
Run Code Online (Sandbox Code Playgroud)
Edit2:更新以考虑整数值
Edit3:请注意,这目前仅适用于正数
| 归档时间: |
|
| 查看次数: |
1844 次 |
| 最近记录: |