是否在Matlab中为矩阵应用了任何比较运算符,如点运算符'。*','。/','。^'

时间:2011-05-06 14:52:22

标签: matlab matrix dot-operator

我有这样的功能

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

非常感谢。

2 个答案:

答案 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)

这会产生下图

enter image description here

答案 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);