2017-06-22 6 views
7

おはよう/午後/夕方、要素単位で直接動作しない関数を統合する

私は四次テンソル計算ボリューム積分を含むMatlabスクリプトを作成しています。 H(r、θ、φ)を積分したい関数とする。 r、θ、φの簡単な演算ではHを得ることができないと仮定する。

私の問題は、MATLABで他のコードのように、私が知っているということです。

All input functions must accept arrays and operate elementwise. The function FUN(X,Y,Z) 
must accept arrays X, Y, Z of the same size and return an array of corresponding values. 

これは、MATLABからintegral3 functionの実装からです。

私はこの単純な機能をしようとした場合:

fun = @(X,Y,Z) X.*Y.*Z 

私は、そこには問題が全くありませんし、私はそれを上に統合する場合は、[0,1]×[0,1]×[0,1]正しい結果を得る:

integral3(fun,0,1,0,1,0,1) 

戻り値は0.125です。

問題は、私が言ったように、私はHを得るために、ベクターを用いて、簡単な計算を実行することができないと私は多かれ少なかれ、このようなことを行うことを余儀なくしていますということです。

function [result] = fun(x,y,z) 
    sz = length(x); 
    result = zeros(1,sz); 
    for i=1:sz 
     result(i) = x(i)*y(i)*z(i); 
    end 
end 

この関数は、その上で動作します私が先に紹介したものと全く同じ結果を返します。しかし、私はintegral3使用しようとすると、私はこのエラーを取得:

Error using integral2Calc>integral2t/tensor (line 241) 
Integrand output size does not match the input size 

しかし、それは明らかに、私は具体的に、入力の大き作られた私の関数の定義から見ることができます。

私は何が間違っているのか分かりません。この種の構文を使用するよりも、この機能を計算するための他の解決方法はありません。あなたの時間と助けを

おかげでたくさん:)

+1

@drhagenの回答に追加するものはありませんが、この美しく書かれた質問に感謝したいだけです! – Toghe

答えて

4

あなたは正しい軌道に乗っているが、あなたは正しい長さの配列が、間違ったサイズを構築しています。 Matlabの微妙な違いです。私はintegral3が列ベクトルを渡していると推測していますが、関数は常に行ベクトルを返します。列ベクトルと行ベクトルは同じ「長さ」szですが、「サイズ」は異なります。列ベクトルは[sz,1]で、行ベクトルは[1,sz]です。以下のコードは、それが出力のすべての寸法は、個々の要素をループへの入力とnumelと一致していることを確認するためにsizeを使用していますので、あなたが欲しいものを行います。

function result = fun(x,y,z) 
    sz = size(x); 
    result = zeros(sz); 
    for i = 1:numel(x) 
     result(i) = x(i)*y(i)*z(i); 
    end 
end 

良い経験則だけで使用することですsizeおよびnumelを使用してください。lengthは決して使用しないでください。これはMatlabの最悪の機能の候補です。

+0

'length'アドバイスのためにUpvoted! –

+0

@drhagen関数 'integral3'が列や行ベクトルの代わりに配列を使う場合にのみ' size'と二重ループを 'size(1)'と 'size(2)君は ! また、長さのアドバイスをありがとうございます! –

+0

@JeremyDiallo実際には、線形インデクシングのために、配列が2D、3D、4Dなどの配列であっても、私のバージョンは機能します。 – drhagen

関連する問題