1

我正在尝试绘制 Shifted Schwefel 问题函数的轮廓,但一直出现此错误:Z 的大小必须为 2x2 或更大。我在这个论坛上搜索了一些我帮助过的信息,但无法修复上述错误。我从这个论坛获得的信息引导我尝试这段代码:

min = -50;
max = 50;
steps = 20;
c = linspace(min, max, steps); % Create the mesh
[x, y] = meshgrid(c, c); % Create the grid
%o=-50+100*rand(1,2);
%c = c - repmat(o,1,10);

for I=1:length(x)
    for J=1:length(y)
    o=-50+100*rand(1,2);
    x=x-repmat(o,20,10);
    f = max(abs(x), [], 2); 
    end
end

figure,
contour(x,y,f);

figure,
surfc(x, y,f);

现在我有 z 的错误,其中 f 的值最多至少为 2x2 或更大。我知道我的 f 只接受一个输入,因此只会输出一个。我尝试将它放在嵌套的 for 循环中,但仍然给我一个向量数组,而不是至少 2x2 的矩阵。如果输入是两个,那么问题会很好,但问题是,它是一个输入。有谁知道我怎样才能使这个“f”输出一个至少 2x2 的矩阵,以便我可以绘制轮廓的 z?

4

1 回答 1

0

有几点需要注意:

1.)正如 Jacob Robbins 在他的评论中正确指出的那样,您应该避免使用来自 Matlab 函数的名称作为变量名称(在您的情况下为minand max)。一种非常简单的方法是只使用大写字母作为变量名。

2.)您说您f的只是一个输出是正确的(尽管在这种情况下,一个输出不是单个数字,而是一个向量)。也就是说,因为您没有在循环中为其分配任何索引。

3.)是的,两者都contour需要surfc,至少需要2x2- 因为它们在网格上绘制信息,至少2x2在本质上它本身就是。

4.)在您的特定情况下,可能不需要两个循环。您似乎只是在操纵x-vector 并且您的网格是规则的。因此,您可能想尝试这个循环:

for I=1:length(x)
    o=-50+100*rand(1,2);
    x=x-repmat(o,20,10);
    f(:,I) = max(abs(x), [], 2);
end

现在,f将是 size 20x20,对应于您的x- 和y-grid 。此外,现在您的contourandsurfc命令将生成绘图。

5.) 最后一条评论:您的函数的输出和“Shifted Schwefel 函数”的网络搜索结果非常不同。但是,如果您的 Shifted Schwefel 函数的实现是正确的,应该作为一个新问题提出。

于 2013-06-29T19:09:25.373 回答