You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:26:27