0

水域の日射測定値のベクトルがあります。水柱の特定の深さに到達する日射量を計算したいと思います。これは、測定の2番目の深さに適用したランベルトベールの法則から計算できます。

rad = 1+(30-1).*rand(365,1);
depth = 1:10;

kz = 0.4;
rad(:,2) = rad(:,1).*exp(-kz.*depth(2));

ベクトル「depth」で指定されたすべての深度にこれをどのように適用しますか?つまり、365行10列の行列を生成するにはどうすればよいでしょうか。各列は、その特定の深さに到達する放射線を参照します。

4

2 に答える 2

3

散乱と吸収による放射の減衰は、深さあたりの単純な % 損失であるため、最初の放射から非常に簡単に結果を計算できます。

initialRad = 1+(30-1).*rand(365,1);
depth = 0:10; %# start with zero so that the first column is your initial radiation

kz = 0.4;
rad = bsxfun(@times, initialRad, exp(-kz*depth) );

@Rasman が指摘しているようにbsxfun、m 行 1 列の配列と 1 行 n 列の配列を乗算すると m 行 n 列の配列になるため、代わりにベクトル乗算を使用できることに注意してください。配列に追加の次元 (たとえば、複数のbsxfunテストを行う場合は m x 1 x k および 1 x n x k) がある場合、またはベクトルが転置 (例: 1 x m および n x 1)。initialRad以下の解決策は、優れた線形代数スキルの優れたデモンストレーションですが、2 つのベクトルと -ステートメントでドット乗算を使用しない理由を追加することをお勧めしますexp

rad = initialRad * exp(-kz * depth);
于 2012-11-14T15:51:38.247 に答える
-1

ループを使用する必要があります。

ここでは、それらに関するチュートリアルとその使用方法を読むことができます。

http://www.mathworks.com/help/distcomp/for.html

基本的に必要なのは、 i をメインパラメーターとして含む for ループです。どちらのために実行する必要があります

i=1 .. 9

そしてあなたの主な任務は

rad(:,i+1) = rad(:,i).*exp(-kz.*depth(2));

より正確には

for i = drange(1:9)
   rad(:,i+1) = rad(:,i).*exp(-kz.*depth(2));
end

件名はわかりませんが、この関数は行列を列ごとにスイープし、列 1 を使用して列 2 の割り当てを開始し、列 10 まで続けます。

于 2012-11-14T15:40:08.540 に答える