我有一个水体的太阳辐射测量矢量,我想计算到达水柱某些深度的辐射。这可以用比尔定律计算,我已经应用了第二次测量深度:
rad = 1+(30-1).*rand(365,1);
depth = 1:10;
kz = 0.4;
rad(:,2) = rad(:,1).*exp(-kz.*depth(2));
如何将此应用于矢量'depth'中指定的所有深度?即,我将如何生成具有365行和10列的矩阵,其中每列指的是到达该特定深度的辐射。
答案 0 :(得分: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-by-n数组。 bsxfun
解决方案可以更加健壮,因为当数组具有额外的维度时(例如,如果进行多次测试,m-by-1-by-k和1-by-n-by-k),它也可以工作,或者如果矢量被转置(例如1乘1和n乘1)。下面的解决方案是良好的线性代数技能的一个很好的演示,但您可能想要添加一个注释,为什么不使用点乘法与两个向量initialRad
和exp
- 语句。
rad = initialRad * exp(-kz * depth);
答案 1 :(得分:-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列。