### 优化 MATLAB 脚本以手动选择文件夹路径
在 MATLAB 脚本中硬编码文件路径会降低代码的可移植性和灵活性。为了提升脚本的交互性和可重用性,可以使用 `uigetdir` 函数让用户手动选择文件夹路径,从而避免硬编码路径带来的限制。
```matlab
% 使用图形界面选择文件夹路径
filepath = uigetdir('','请选择包含 .dat 文件的文件夹');
if isequal(filepath, 0)
error('用户取消了文件夹选择');
end
```
上述代码会弹出一个对话框,允许用户选择任意文件夹。若用户取消选择,脚本将抛出错误以避免后续操作失败。这种方式增强了脚本的通用性,使脚本适用于不同用户的本地环境。
在后续处理中,脚本可以沿用原始逻辑获取 `.dat` 文件并进行分类处理。通过将路径选择交由用户完成,脚本不再依赖固定的路径设定,提升了跨平台和跨用户的适应能力[^2]。
### 优化后的完整脚本示例
```matlab
% 手动选择文件夹路径
filepath = uigetdir('','请选择包含 .dat 文件的文件夹');
if isequal(filepath, 0)
error('用户取消了文件夹选择');
end
% 获取文件夹下的所有 .dat 文件
files = dir(fullfile(filepath, '*.dat'));
% 初始化数据存储
VNAllData = [];
NIRAllData = [];
% 遍历所有 .dat 文件
for k = 1:length(files)
filename = fullfile(filepath, files(k).name);
[~, nameOnly, ~] = fileparts(filename);
% 区分大小写匹配 VN 或 NIR
if contains(nameOnly, 'VN', 'IgnoreCase', false)
dataLength = 820;
VNtotalData = [];
fid = fopen(filename, 'rb');
if fid == -1
warning('无法打开文件: %s', filename);
continue;
end
while ~feof(fid)
data = fread(fid, dataLength, 'ubit16');
if length(data) == dataLength
data10 = data(1:min(10, length(data)));
if ~all(data10 == data10(1))
VNtotalData = [VNtotalData; data];
end
end
end
fclose(fid);
% 计算均值
if ~isempty(VNtotalData)
VNmeanValue = mean(double(VNtotalData'));
VNAllData = [VNAllData, VNmeanValue'];
end
fprintf('Loaded %s\n', files(k).name);
end
if contains(nameOnly, 'NIR', 'IgnoreCase', false)
dataLength = 512;
NIRtotalData = [];
fid = fopen(filename, 'rb');
if fid == -1
warning('无法打开文件: %s', filename);
continue;
end
while ~feof(fid)
data = fread(fid, dataLength, 'ubit16');
if length(data) == dataLength
data10 = data(1:min(10, length(data)));
if ~all(data10 == data10(1))
NIRtotalData = [NIRtotalData; data];
end
end
end
fclose(fid);
% 计算均值
if ~isempty(NIRtotalData)
NIRmeanValue = mean(double(NIRtotalData'));
NIRAllData = [NIRAllData, NIRmeanValue'];
end
fprintf('Loaded %s\n', files(k).name);
end
end
% 保存结果
if ~isempty(VNAllData)
writematrix(VNAllData, fullfile(filepath, 'VNall_value.csv'));
end
if ~isempty(NIRAllData)
writematrix(NIRAllData, fullfile(filepath, 'NIRall_value.csv'));
end
```
### 优势与改进点
- **用户交互性增强**:通过 `uigetdir` 实现路径选择,提升脚本的人机交互能力,使脚本适用于不同用户环境。
- **代码可维护性提升**:减少硬编码路径的依赖,提高脚本的可移植性和可读性。
- **错误处理优化**:加入路径和文件打开失败的判断,避免因用户操作不当导致程序崩溃。
- **数据处理效率优化**:采用预分配或条件判断避免不必要的数据拼接操作,提升处理效率。
###