如何绘制 3D 图?

How to 3D plot?

由于我在矩阵中存储数据的方式(对应于插槽的 x 和 y 值),我无法让 xiyi 范围包含任何正整数值它们存储在),但我想不出更聪明的方法。有人可以帮帮我吗?我希望能够让 xi = -30:30yi = -30:30.

function test3

f = @(x,y) y*sin(x) + sqrt(y);

    function p
        xi = 1:30;
        yi = 1:30;

        pts = zeros(size(xi,2),size(yi,2));
        for x = xi
            for y = yi
                pts(x,y) = pts(x,y) + f(x,y);
            end
        end
        surf(xi,yi,pts)
    end
p
end

我正在处理的实际代码:

function Eplot(z, w, R, Psi)
        ni = 0:2:4;
        mi = 0;
        xi = -30:30;
        yi = -30:30;

        pts = zeros(size(xi,2),size(yi,2));

        for n = ni
            for m = mi
                for x = xi
                    for y = yi
                        pts(x,y) = pts(x,y) + utot(z, x/10^4, y/10^4, n, m, w, R, Psi);
                    end
                end
            end
        end
        surf(xi,yi,pts)
    end
Eplot(zi, wi, Ri, Psii)

使用 meshgrid(如 surf 的文档中所述)并编写您的函数 f 以使用逐个元素的操作,以便它可以接受矩阵输入。

f = @(x,y) y.*sin(x) + sqrt(y);
xi = -30:30;
yi = -30:30;
[x,y]=meshgrid(xi,yi);
surf(xi,yi,f(x,y))

(此外,我希望您真的不想为 y 的负值绘制 sqrt(y)

如果您不能以允许为其提供向量参数的方式编写函数,那么您的 for 循环是一种合理的方法,但我会这样写:

f = @(x,y) y.*sin(x) + sqrt(y);
xi = -30:30;
yi = -30:30;
pts=zeros(length(xi),length(yi));
for ii=1:length(xi)
    for jj=1:length(yi)
        pts(ii,jj)=f(xi(ii),yi(jj));
        %// If `f` has more variables to iterate over (n, m, etc.) and sum, 
        %// do those loops inside the ii and jj loops
        %// I think it makes the code easier to follow
    end
end
surf(xi,yi,pts)