0

我有这样的功能

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

非常感谢你。

4

2 回答 2

2

你得到一个错误,因为函数f(x,y)返回一个标量zmesh期望z是一个矩阵。您可以用一个简单、快速的矢量化解决方案替换上面的所有函数和代码,该解决方案使用逻辑索引

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)

这将产生下图

在此处输入图像描述

于 2011-05-06T14:58:19.250 回答
0

引用 Mackey 先生的话:带有索引矩阵的 for 循环不好,是吗?这需要很多时间,可以吗?

为了效率,我将 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);
于 2011-05-06T17:56:39.003 回答