MATLAB球坐标曲面绘图报错:矩阵乘法维度不匹配求助
问题修复方案
错误根源
你遇到的矩阵维度错误,是因为theta和phi都是行向量,直接使用*会触发MATLAB的矩阵乘法规则(要求第一个矩阵列数等于第二个矩阵行数),而你需要的是逐元素乘法,同时还需要生成二维网格数据来适配surf的输入要求。
修正后的完整代码
% Define tensor components sigma11 = 20; sigma22 = 10; sigma33 = 10; sigma23 = -40; sigma13 = 0; sigma12 = 0; % 生成theta和phi的二维网格(替代原行向量,适配surf的二维输入) [theta, phi] = meshgrid(0:0.05:180, 0:0.05:360); % 适当步长减少计算量 % 计算sigma_n:全部使用逐元素乘法.*,避免矩阵乘法错误 sigma_n = sigma11 * cosd(theta).^2 .* sind(phi).^2 ... + 2 * sigma12 * sind(phi).^2 .* cosd(theta) .* sind(theta) ... + 2 * sigma13 * cosd(phi) .* cosd(theta) .* sind(phi) ... + sigma22 * sind(theta).^2 .* sind(phi).^2 ... + 2 * sigma23 * cosd(phi) .* sind(theta) .* sind(phi) ... + sigma33 * cosd(phi).^2; % 转换为直角坐标系:同样使用逐元素乘法 x_n = abs(sigma_n) .* cosd(theta) .* sind(phi); y_n = abs(sigma_n) .* sind(theta) .* sind(phi); z_n = abs(sigma_n) .* cosd(phi); % 绘制正负区域:直接用矩阵掩码区分颜色,无需索引成向量 surf(x_n, y_n, z_n, sigma_n); % 用sigma_n的值映射颜色 colormap(jet); colorbar; hold on; % 单独标记负区域(可选) surf(x_n.*(sigma_n<0), y_n.*(sigma_n<0), z_n.*(sigma_n<0), 'FaceColor', 'r', 'EdgeColor', 'none'); hold off; axis equal; title('球坐标系下的σₙ曲面');
关键修正点
- 使用
meshgrid生成二维网格:将theta和phi从行向量转换为二维矩阵,确保后续计算得到的sigma_n是二维数组,符合surf的输入要求。 - 替换所有矩阵乘法
*为逐元素乘法.*:避免维度不匹配错误,确保每个位置的元素独立计算。 - 优化绘图逻辑:直接利用
sigma_n的值做颜色映射,或者用掩码矩阵(sigma_n<0)单独渲染负区域,避免索引后变成一维向量导致surf无法识别。
其他注意事项
- 原代码中
sigma32、sigma31、sigma21的定义是冗余的,因为后续计算没有用到,可以删除。 - 适当增大步长(比如从0.01改成0.05)可以减少计算量,避免内存占用过高。
- 添加
axis equal可以让曲面显示比例正确,符合球坐标系的视觉效果。
内容的提问来源于stack exchange,提问作者avcc
相关产品推荐
相关产品推荐

