2016-07-19 12 views
0

関数を定義するときは、たとえばTEST = @(t) t.^2とします。入力がベクトルの場合は、[1,2,3,4]TEST([1,2,3,4]) = [1,4,9,16]とします。スクリプトを書くときに同時にすべての値を計算することはできますか?

定義された関数がスクリプト形式であれば同様のことができますか?私が意味することは、もし私がret = TEST(x,y,z)という数値を知っているときに値を出力するようなTEST.mと言うと、スクリプトがあると言うと、yzという数値があります。 x,yが固定されているとき、例えばそれぞれ0,1としたときに、zの100の異なる値を1から100の範囲で計算したいとします。 forループを記述したり、スクリプトTEST.mの内容を変更したりせずにTEST(0,1,1:1:100)を出力することはできますか?

このような質問をする理由は、計算時間から来ています。通常、私が持っているスクリプトは少し複雑なので、単一の値の計算には数分かかることがあります。 for-loopを出力すると、非常に時間がかかることがあります。私はparforループを書いていると思いますが、計算時間はまだまだ私にとってはそれ以上のものです。私は一度に100のすべての値を計算できるのだろうかと思います。私はプログラマーの初心者です。私はこのポストの後に満足のいく答えを得ることができれば幸いです。あなたのすべての協力に感謝します。

+1

これは、 'TEST'がどのように値を計算しているかによって決まりますが、ほとんどの場合、答えはyesです。 'x'、' y'、 'z'の使い方の計算例を提供してください。 kthxbye。 – rayryeng

+0

一般に、TEST内の関数は簡単に表現することはできません。簡単化のために、スクリプトTEST.mが として定義されていると仮定してください。関数ret = TEST(x、y、z) ret = f(x、y、z) fはx^3 + y^2 +簡単にするためにz^4です。一般的に、関数は非常に複雑になる可能性があることを忘れないでください。特定の値に対してx、y、zを渡すと、答えが得られることに注意してください。 私のポイントは、スクリプト内の構造についての変更はありません。 x^3 + y。^ 2 + z。^ 4のように関数を書き換えないでください。ベクトルの入力が可能です。 –

+0

私はTEST.mを呼び出す別のスクリプトを書いています。私の究極の目標は、forループを書くことなく、例えばTEST(0,1,1:1:100)の数値を得ることです。 –

答えて

0

新しい無名関数を定義して、固定値をパラメータとして、ベクトルを入力として定義します。次に、arrayfunを使用して、配列のすべての値について計算します。

function ret = TEST(x,y,z) 
    ret = f(x)+g(y)+h(z); 
end 

function r = f(x) 
r = x^2; 
end 

function r = g(y) 
r = y^3; 
end 

function r = h(z) 
r = z^4; 
end 

そして、あなたからそれを呼び出す::だからTは定数としてxyを扱う新しい関数であり、入力としてのみzを持って

x = 2; 
y = 3; 
z = 1:5; 
T = @(z) TEST(x,y,z); 
arrayfun(T,z) 

は、あなたがこの機能を持っていると言います。その後arrayfunTを取り、z内のすべての要素のためにそれを計算し、あなたが得る:

ans = 

    32 47 112 287 656 

を今、xyが一定とどまることができる場合は、[a,b,c] = arrayfun(T,z,w,v)のように、より多くのベクターでarrayfunを使用することができます。

+0

@will_cheukこれが問題を解決しましたか?そうでない場合、なぜですか? – EBH

関連する問題