我正试图绘制移位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?
最佳答案
有几点需要注意:
1.)正如Jacob Robbins在他的评论中正确指出的那样,您应该避免使用来自Matlab函数的名称作为变量名(在您的例子中是min
和max
)一个非常简单的方法是,只对变量名使用大写字母。
2.)您正确地说,您的f
只是一个输出(尽管在本例中,一个输出不是一个数字,而是一个向量)。也就是说,因为在循环中没有给它分配任何索引。
3.)是的,contour
和surfc
都至少需要2x2
——因为它们在网格上绘制信息,而网格本身在本质上至少是2x2
。
4)在您的特殊情况下,可能不需要两个循环。你似乎只在操纵x
-向量,你的网格是规则的。因此,您可能需要尝试此循环:
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
的大小将是20x20
,它对应于您的x
-和y
-网格。另外,现在您的contour
和surfc
命令将生成绘图。5.)最后一条评论:你的函数输出和搜索“移位schwefel函数”的结果非常不同。但是,如果移位schwefel函数的实现是正确的,那么这个问题应该作为一个新问题来提出。