【问题标题】:Is there any comparation operator applied for matrixs in Matlab, like the dot operator '.*', './', '.^'Matlab中是否有适用于矩阵的比较运算符,例如点运算符'.*','./','.^'
【发布时间】:2011-08-20 06:24:12
【问题描述】:

我有这样的函数 f

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

非常感谢。

【问题讨论】:

    标签: matlab matrix dot-operator


    【解决方案1】:

    引用 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);
    

    【讨论】:

      【解决方案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)
      

      这会产生下图

      【讨论】:

      • 非常感谢。使用逻辑索引的想法很棒。我的问题解决了。
      • @James:很高兴能帮上忙。也许您不知道,但您可以通过单击答案旁边的复选标记将答案标记为“已接受”,以便其他可能遇到相同问题的人更容易找到有效的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多