根据给定向量的指数下降值的矩阵

时间:2012-11-14 15:33:24

标签: matlab vector matrix

我有一个水体的太阳辐射测量矢量,我想计算到达水柱某些深度的辐射。这可以用比尔定律计算,我已经应用了第二次测量深度:

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

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

如何将此应用于矢量'depth'中指定的所有深度?即,我将如何生成具有365行和10列的矩阵,其中每列指的是到达该特定深度的辐射。

2 个答案:

答案 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)。下面的解决方案是良好的线性代数技能的一个很好的演示,但您可能想要添加一个注释,为什么不使用点乘法与两个向量initialRadexp - 语句。

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列。