MATLAB interp2插值问题求助:需生成全范围插值扭矩数组
解决MATLAB中interp2二维插值仅生成单个值的问题
问题分析
你当前的代码存在几个核心问题,导致最终只得到单个插值结果:
- 循环里的
Theta_Int、I_Phase_Int和Torque_Value每次迭代都会被覆盖,最终仅保留最后一次循环的数值(也就是90和460对应的扭矩值) - 预先创建的
Matrix_int数组完全没有被赋值,因为index_Theta和index_I从未在循环中递增或使用 - 最后调用
surf时只用了单个点,而非整个插值后的矩阵
修正方案:正确使用循环填充插值数组
先修复循环逻辑,确保每个插值结果都存入Matrix_int对应的位置:
% 原始数据整理(将一维Torque_Matrix转为10x10矩阵) I_Phase1 = [0 51.1111 102.2222 153.3333 204.4444 255.5556 306.6667 357.7778 408.8889 460]; Theta1 = [-45 -30 -15 0 15 30 45 60 75 90]; Torque_Matrix = reshape([0 0 0 0 0 0 0 0 0 0, 28.6989 35.9452 41.1581 43.8173 43.5092 40.0174 33.4011 24.0388 12.6221 0.0940, 52.6956 67.7241 79.8022 87.4465 89.2066 84.0131 71.5044 52.2439 27.7582 0.3762, 71.9900 95.3367 115.9323 130.8876 137.0923 131.9869 114.3100 84.6153 45.4083 0.8464, 86.5822 118.7830 149.5483 174.1406 187.1661 183.9389 161.8178 121.1530 65.5724 1.5047, 96.4722 138.0630 180.6504 217.2055 239.4282 239.8691 214.0278 161.8569 88.2505 2.3511, 101.6600 153.1768 209.2385 260.0824 293.8785 299.7776 270.9400 206.7272 113.4425 3.3856, 102.1456 164.1242 235.3126 302.7711 350.5170 363.6642 332.5544 255.7637 141.1486 4.6082, 97.9289 170.9054 258.8727 345.2718 409.3438 431.5290 398.8711 308.9666 171.3687 6.0188, 89.0100 173.5203 279.9188 387.5844 470.3588 503.3720 469.8900 366.3357 204.1028 7.6176], 10, 10); % 定义插值范围(可根据需求调整步长) Theta_Int_Vec = -45:1:90; I_Phase_Int_Vec = 0:1:460; % 初始化插值结果矩阵 Matrix_int = zeros(length(Theta_Int_Vec), length(I_Phase_Int_Vec)); % 嵌套循环填充插值结果 for idx_theta = 1:length(Theta_Int_Vec) for idx_i = 1:length(I_Phase_Int_Vec) Theta_Val = Theta_Int_Vec(idx_theta); I_Val = I_Phase_Int_Vec(idx_i); Matrix_int(idx_theta, idx_i) = interp2(Theta1, I_Phase1, Torque_Matrix, Theta_Val, I_Val); end end % 可视化原始数据和插值结果 surf(Theta1, I_Phase1, Torque_Matrix); hold on % 生成插值点网格用于绘图 [Theta_Grid, I_Grid] = meshgrid(Theta_Int_Vec, I_Phase_Int_Vec); surf(Theta_Grid, I_Grid, Matrix_int', '.r'); % 转置矩阵匹配网格维度 hold off xlabel('Theta'); ylabel('I_Phase'); zlabel('Torque'); legend('原始数据', '插值结果');
更高效的MATLAB向量化写法(推荐)
MATLAB天生适合向量化运算,完全不需要嵌套循环,直接用meshgrid生成网格点后一次性完成插值:
% 原始数据同上,省略重复部分 % 生成插值网格点 [Theta_Grid, I_Grid] = meshgrid(-45:1:90, 0:1:460); % 一次性完成二维插值 Matrix_int = interp2(Theta1, I_Phase1, Torque_Matrix, Theta_Grid, I_Grid); % 可视化 surf(Theta1, I_Phase1, Torque_Matrix); hold on surf(Theta_Grid, I_Grid, Matrix_int, '.r'); hold off xlabel('Theta'); ylabel('I_Phase'); zlabel('Torque'); legend('原始数据', '插值结果');
关键补充说明
- 维度匹配:
interp2要求输入的Theta1和I_Phase1分别对应矩阵的列和行(或相反,取决于数据排列),确保Torque_Matrix的维度与两个向量长度一致(这里都是10x10) - 步长调整:你可以修改
-45:1:90和0:1:460中的步长(比如改成0.5),生成更密集的插值结果 - 插值方法:
interp2默认用线性插值,你可以添加第四个参数指定方法,例如'cubic'(三次插值)或'nearest'(最近邻插值):Matrix_int = interp2(Theta1, I_Phase1, Torque_Matrix, Theta_Grid, I_Grid, 'cubic');
内容的提问来源于stack exchange,提问作者Pedro Franco
相关产品推荐
相关产品推荐

