Octave 编程教程/文本和文件输出
disp 函数以与简单地输入变量名称相同的方式显示变量的值(标量、向量、矩阵、字符串等)。例如,
octave:1> x = [1, 2, 3] x = 1 2 3 octave:2> disp(x) 1 2 3
然而,变量名不会显示。您还可以显示计算结果,而不会显示通常在其之前的ans =。
octave:3> log(10) ans = 2.3026 octave:4> disp(log(10)) 2.3026
disp 的输出取决于format 命令。
octave:5> format long octave:6> disp(log(10)) 2.30258509299405
可以使用fdisp 将显示的值打印到屏幕、保存到字符串或保存到文件。
octave:7> s = disp(log(10)) s = 2.30258509299405
请注意,s 是一个包含上面显示字符的字符串。
fdisp 函数可用于将值保存到文件。在执行此操作之前,我们必须打开一个文件。这可以通过使用fopen 命令来完成。
fopen(filename, mode)打开一个文件并返回其标识符。filename参数是一个字符串,可以是当前目录中任何新文件或现有文件的名称。mode参数是一个字符串,指定文件是打开用于- 读取 (
r)、 - 写入 (
w),还是 - 追加 (
a)。
当文件以写入方式打开时,其内容将被擦除并替换为新数据。要保留文件中现有的数据并追加到其末尾,请使用追加模式。
octave:10> file_id = fopen('mydata.txt', 'w');
这里,file_id 只是一个变量名,我们使用它来告诉 Octave 要写入哪个文件。
fdisp(file_id, value)将value写入由file_id标识的文件。
写入文件的输出将与disp 命令的输出完全相同。
在将所有数据写入文件后,关闭文件非常重要。 关闭文件告诉 Octave 完成任何可能仍在等待的输出,并释放文件,以便其他用户或程序可以打开它。
fclose(file_id)关闭由file_id标识的文件。
printf 函数比disp 强大得多,因此使用起来也更复杂一些。使用printf,您可以精确定义值的输出应是什么样子。这包括指定
- 要显示的有效位数;
- 数字的格式(整数、实数、科学记数法等);
- 在值之前或之后显示的其他输出。
由于使用printf 格式化输出有许多不同的方法,因此我们在这里只使用示例讨论基础知识。有关更完整的信息,请键入
doc printf
在 Octave 中,并使用空格键翻阅帮助。
printf 函数在其屏幕上显示其输出。使用sprintf 将结果返回到字符串中,使用fprintf 将其写入文件。请注意,fprintf 需要一个额外的参数来指定文件标识符。
printf(format, value, ...)sprintf(format, value, ...)fprintf(fid, format, value, ...)
请注意,这些函数可以同时输出多个值,有关详细信息,请参见下一节。
让我们看一个例子。
octave:18> x = 10.1;
octave:19> y = 5.5;
octave:20> z = 'test';
octave:21> printf('An integer: %i. A real: %f. This is a %s.\n', x, y, z);
An integer: 10. A real: 5.500000. This is a test.
重要的是第 21 行中printf 函数的第一个参数。它指定了printf 的输出应是什么样子。本质上,百分号 (%) 表示应将一个值放置在其在格式字符串中的位置。在格式字符串中
'An integer: %i. A real: %f. This is a %s.\n'
%i 将被替换为一个整数,%f 将被替换为一个实数 (f 表示浮点数),%s 将被替换为一个字符串。整数、实数和字符串的值作为参数传递给printf,位于格式字符串之后。请注意,上面的示例中x 等于 10.1,但显示的值为 10,因为我们指定了printf 应该显示一个整数。最后,字符串末尾的\n 告诉 Octave 移动到新的一行。
下一个示例演示了以下类型
- 整数 (
%i), - 实数 (
%f), - 科学记数法 (
%e), - 百分号 (
%%)。
有关更多类型,请参阅 Octave 文档。
octave:22> x = 10.34;
octave:23> printf("x is a real number: %f (%e in scientific notation).\n", x, x);
x is a real number: 10.340000 (1.034000e+01 in scientific notation).
octave:24> printf("Write percentages as %i%%.\n", x);
Write percentages as 10%.
请注意
%e格式将值输出为 的形式,其中 且 b 为整数;- 变量
x在第 23 行传递给printf两次,因为我们希望将其输出两次(以不同的格式); - 第 24 行的双百分号 (
%%) 输出一个单百分号。
我们可以通过指定以下内容来进一步自定义值的输出
- 输出的宽度,以及
- 输出的精度。
宽度允许您右对齐数字,并在百分号和格式说明符之间指定。例如,
octave:36> x = 10;
octave:37> y = pi;
octave:38> z = 'test';
octave:39> printf("%9i\n%9f\n%9s\n", x, y, z);
10
3.141593
test
请注意,在printf 中,每个格式说明符都包含一个整数 (9)。这告诉printf 使用 9 列输出整数、实数和字符串。
精度参数的效果取决于输出类型。它最明显的用法是指定在实数的小数点后显示的位数。精度在宽度之后指定,并由一个点 (.) 前缀。
octave:40> printf("%9.3f\n", pi);
3.142
这将使用 9 列和小数点后 3 位显示 π。请注意,数字是四舍五入的。有关精度参数的其他用途(例如,用于整数和字符串),请参阅 Octave 帮助。
当传递给printf 函数的值为矩阵或向量时,将打印其中的所有值。如果格式字符串中只有一个格式说明符,则它将用于矩阵中的每个值。
octave:51> A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
octave:52> printf("%i\n", A)
1
4
7
2
5
8
3
6
9
请注意,值是从矩阵中以列优先顺序读取的,即首先显示第一列的所有值,然后是第二列,依此类推。
如果格式字符串中有多个格式说明符,printf 将循环遍历它们。
octave:57> printf("[%i, %.1f, %.2e]\n", A)
[1, 4.0, 7.00e+00]
[2, 5.0, 8.00e+00]
[3, 6.0, 9.00e+00]
值仍然以列优先顺序读取。