0

私はこのような関数 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 がスカラー値ではなく 2 つの配列であるためです。変更すると、スクリプトを実行できます

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 に答える