基于Excel数据在MATLAB中生成双变量查找表(LUT)的步骤咨询
MATLAB 手动实现双输入查找表(LUT)步骤
1. 读取Excel数据
先把Excel中的输入变量(设为x1、x2)和输出变量(y)导入MATLAB:
- 若Excel无表头,直接用
readmatrix读取:data = readmatrix('your_data_file.xlsx'); x1 = data(:, 1); % 第一列为第一组输入 x2 = data(:, 2); % 第二列为第二组输入 y = data(:, 3); % 第三列为对应输出 - 若Excel带表头,用
readtable提取对应列:tbl = readtable('your_data_file.xlsx'); x1 = tbl.x1_column_name; % 替换为实际表头名 x2 = tbl.x2_column_name; y = tbl.y_column_name;
2. 生成规则输入网格
查找表需要基于排序去重后的输入值构建规则网格:
% 对两组输入变量去重并排序 x1_unique = sort(unique(x1)); x2_unique = sort(unique(x2)); % 生成二维网格,对应所有输入组合 [X1_grid, X2_grid] = meshgrid(x1_unique, x2_unique);
3. 构建输出查找表矩阵
将原始数据中的输出值匹配到对应网格位置,这里提供两种实现方式:
方式1:双重循环(直观易调试)
% 初始化输出网格,未匹配的位置先设为NaN Y_grid = NaN(size(X1_grid)); for i = 1:length(x1_unique) for j = 1:length(x2_unique) % 定位原始数据中对应(x1,x2)组合的索引 match_idx = (x1 == x1_unique(i)) & (x2 == x2_unique(j)); if any(match_idx) % 将对应输出值填入网格(注意meshgrid的维度对应关系) Y_grid(j, i) = y(match_idx); end end end
方式2:accumarray(高效处理大数据)
如果原始数据量较大,用accumarray更高效:
% 将原始输入值转换为网格对应的索引 [~, ~, x1_idx] = histcounts(x1, x1_unique); [~, ~, x2_idx] = histcounts(x2, x2_unique); % 聚合输出值,若存在重复(x1,x2)组合,可替换@(v) v(1)为@mean/@max等处理逻辑 Y_grid = accumarray([x2_idx, x1_idx], y, ... [length(x2_unique), length(x1_unique)], ... @(v) v(1));
4. 验证查找表
用interp2测试查找/插值效果,比如查询某个输入组合的输出:
test_x1 = 15; % 测试用的第一组输入值 test_x2 = 25; % 测试用的第二组输入值 % 若测试点在原始数据中存在,直接返回对应输出;否则线性插值 y_result = interp2(x1_unique, x2_unique, Y_grid, test_x1, test_x2); disp(['查询结果:', num2str(y_result)]);
5. 保存查找表(可选)
将生成的查找表保存为MAT文件或Excel文件:
% 保存为MAT文件,方便后续MATLAB调用 save('lookup_table.mat', 'x1_unique', 'x2_unique', 'Y_grid'); % 保存为Excel文件,方便查看 writematrix([x1_unique; Y_grid'], 'lut_output.xlsx');
注意事项
- 确保原始数据中每个
(x1,x2)组合唯一,若存在重复,需在accumarray中指定重复值处理逻辑(如取平均、最大值)。 - 若网格中存在
NaN,说明对应输入组合无原始数据,可根据需求用fillmissing填充或保留空值。
内容的提问来源于stack exchange,提问作者Abhishek Pawar
相关产品推荐
相关产品推荐

