第一次用Matlab输出结果时,你是不是也和我一样只会用disp?直到某天看到同学代码里整齐的表格输出,才发现原来Matlab的输出可以这么专业。今天我们就来彻底解决这个痛点,手把手教你用fprintf实现各种高级输出效果。
disp函数就像是个直性子,有什么就一股脑全倒出来。而fprintf则像个细心的排版师,能精确控制每个数字的小数位、字符串的对齐方式,甚至还能生成专业的数据报告文件。
举个简单例子,输出圆周率π的值:
matlab复制disp(pi) % 直接输出:3.1416
fprintf('%.2f\n', pi) % 输出:3.14
fprintf('%.4f\n', pi) % 输出:3.1416
fprintf('%10.4f\n', pi) % 输出: 3.1416(右对齐)
fprintf的核心优势在于:
提示:在需要快速查看变量内容时用disp,在需要精美输出时用fprintf,两者各有所长。
fprintf的基本结构是这样的:
matlab复制fprintf(formatSpec, A1, A2, ..., An)
其中formatSpec是格式字符串,后面的A1到An是要输出的变量。
| 说明符 | 用途 | 示例 | 输出示例 |
|---|---|---|---|
| %d | 整数 | fprintf('%d',15) | 15 |
| %f | 浮点数 | fprintf('%.2f',pi) | 3.14 |
| %e | 科学计数法 | fprintf('%.2e',1000) | 1.00e+03 |
| %s | 字符串 | fprintf('%s','hello') | hello |
| %c | 单个字符 | fprintf('%c','A') | A |
在%和字母之间可以插入各种控制参数:
matlab复制%[标志][宽度][.精度]类型
实际应用示例:
matlab复制% 控制小数位数
fprintf('%.3f\n', pi) % 输出:3.142
% 控制总宽度和对齐
fprintf('%10s\n', 'hello') % 右对齐:" hello"
fprintf('%-10s\n', 'hello') % 左对齐:"hello "
% 补零显示
fprintf('%05d\n', 12) % 输出:00012
假设我们要输出一个学生成绩表:
matlab复制names = {'张三','李四','王五'};
scores = [85, 92; 76, 88; 90, 95];
fprintf('%-8s %6s %6s\n', '姓名', '数学', '物理');
fprintf('----------------------\n');
for i = 1:length(names)
fprintf('%-8s %6d %6d\n', names{i}, scores(i,1), scores(i,2));
end
输出效果:
code复制姓名 数学 物理
----------------------
张三 85 92
李四 76 88
王五 90 95
把上面的表格保存到文件中:
matlab复制fileID = fopen('score_report.txt','w');
fprintf(fileID,'%-8s %6s %6s\n', '姓名', '数学', '物理');
fprintf(fileID,'----------------------\n');
for i = 1:length(names)
fprintf(fileID,'%-8s %6d %6d\n', names{i}, scores(i,1), scores(i,2));
end
fclose(fileID);
注意:文件操作后一定要用fclose关闭文件,否则可能导致数据丢失。
在字符串中显示特殊字符需要使用转义序列:
| 转义符 | 含义 | 示例 |
|---|---|---|
| \n | 换行 | fprintf('第一行\n第二行') |
| \t | 制表符 | fprintf('姓名\t年龄') |
| %% | 百分号 | fprintf('完成%d%%',50) |
| \ | 反斜杠 | fprintf('路径:C:\') |
fprintf可以同时输出多种类型数据:
matlab复制name = '张三';
age = 20;
score = 89.5;
fprintf('%s今年%d岁,成绩是%.1f分\n', name, age, score)
输出:"张三今年20岁,成绩是89.5分"
格式说明符与变量类型不匹配
matlab复制% 错误示例
fprintf('%d','hello') % 试图用%d输出字符串
变量数量不足
matlab复制% 错误示例
fprintf('%d %d', 1) % 需要2个变量但只提供了1个
忘记换行符
matlab复制% 多个输出会连在一起
fprintf('hello')
fprintf('world') % 输出:helloworld
假设我们有一组实验测量数据:
matlab复制time = 0:0.5:2; % 时间点(s)
temp = [25.1, 26.3, 28.7, 30.2, 29.8]; % 温度(℃)
生成专业报告:
matlab复制fileID = fopen('experiment_report.txt','w');
fprintf(fileID,'实验温度测量报告\n\n');
fprintf(fileID,'%-10s %12s\n', '时间(s)', '温度(℃)');
fprintf(fileID,'----------------------------\n');
for i = 1:length(time)
fprintf(fileID,'%-10.1f %12.2f\n', time(i), temp(i));
end
fprintf(fileID,'\n最大值: %.2f℃\n', max(temp));
fprintf(fileID,'最小值: %.2f℃\n', min(temp));
fprintf(fileID,'平均值: %.2f℃\n', mean(temp));
fclose(fileID);
在长时间运算时显示进度:
matlab复制total = 100;
for i = 1:total
% 模拟计算过程
pause(0.05);
% 更新进度条
fprintf('进度: [%-20s] %d%%\r', repmat('=',1,round(i/total*20)), round(i/total*100));
end
fprintf('\n完成!\n');