我有这样的功能
function z=f(x,y)
if(x<1 & y <1)
z=0;
else
z=1;
end
end
一个脚本
x=0:0.1:2;
y=0:0.1:2;
[X,Y]=meshgrid(x,y);
Z=f(X,Y);
mesh(X,Y,Z);
运行此脚本时,出现此错误: Z必须是矩阵,而不是标量或向量。
这是因为这里的x和y是两个数组,而不是标量值。如果我更改
,脚本可以运行function f looks like this:
function z = f( x,y )
for i=1:size(x,2)
for j=1:size(y,2)
if(x(i)<1 & y(j)<1)
z(i,j)=0;
else
z(i,j)=1;
end
end
end
end
问题在于新功能的运行速度比第一个快得多。我不知道在这种情况下是否有适用于数组的比较运算符,例如此函数中使用的“。*”运算符
function z=f(x,y)
z=x.*y;
end
非常感谢。
答案 0 :(得分:2)
您收到错误,因为函数f(x,y)
返回z
的标量,而mesh
期望z
成为矩阵。您可以使用简单,快速的矢量化解决方案替换上面的所有函数和代码,该解决方案使用logical indexing:
x=0:0.1:2;
y=0:0.1:2;
[X,Y]=meshgrid(x,y);
Z=ones(size(X));
Z(X(:)<1&Y(:)<1)=0;
mesh(X,Y,Z)
这会产生下图
答案 1 :(得分:0)
引用Mackey先生:对于索引矩阵的循环是坏的,mkay?这需要很多时间,mkay?
为了提高效率,我会将Yoda的代码修改为一个档次:
x=0:0.1:2;
y=0:0.1:2;
[X,Y]=meshgrid(x,y);
Z = ((X>1) | (Y>1))*1;
mesh(X,Y,Z);