Matlab 根据给定向量的指数递减值矩阵

Matlab 根据给定向量的指数递减值矩阵,matlab,vector,matrix,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”中指定的所有深度?i、 e.如何生成一个包含365行和10列的矩阵,其中每列表示达到该特定深度的辐射 您应该使用循环 在这里,您可以阅读有关它们的教程

我有一个水体的太阳辐射测量向量,我想计算到达水柱一定深度的辐射。这可以根据比尔定律计算得出,我已将其应用于测量的第二个深度:

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

kz = 0.4;
rad(:,2) = rad(:,1).*exp(-kz.*depth(2));
如何将其应用于向量“depth”中指定的所有深度?i、 e.如何生成一个包含365行和10列的矩阵,其中每列表示达到该特定深度的辐射

您应该使用循环

在这里,您可以阅读有关它们的教程,以及如何使用它们

基本上,您需要的是一个包含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列。

由于散射和吸收导致的辐射衰减是一个简单的百分比损失,因此您可以很容易地从初始辐射计算结果:

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-by-1数组与1-by-n数组相乘会产生m-by-n数组。
bsxfun
解决方案可能更稳健,因为当阵列具有额外尺寸时(例如,如果进行多个测试,则为m-by-1-by-k和1-by-n-by-k),或者如果向量被转置(例如,1-by-m和n-by-1),它也可以工作。下面的解决方案很好地展示了良好的线性代数技能,不过您可能需要补充一点,说明为什么不使用两个向量
initialRad
exp
-语句的点乘

rad = initialRad * exp(-kz * depth);

公式是:
a(n)=a(n-1)*exp(k*b(n))
还是
a(n)=a(0)*exp(k*b(n))
?因为如果是后者,你只需要做
rad2=rad*exp(-kz*depth)
a(n)=a(0)*exp(k*b(n)),其中a(0)是原始向量,即“rad”。@Rasman:正确,除了必须使用
bsxfun
进行乘法。@Jonas:为什么?365x1矩阵乘以1x10矩阵,得到365x10。也许担心横向标记的唯一目的不应该只是不写循环,事实上,在迭代递归解决方案中,除了使用循环之外没有其他方法。对于不需要循环的问题,循环通常是一个糟糕的主意。更糟糕的是,如果使用循环,则不预先分配阵列,则会导致阵列的大小增加。这是相当低效的。学习预先分配这些数组。并学习如何在不使用循环的情况下解决问题。你的代码将得到改进。我还注意到你的“解决方案”实际上是不正确的,因为它明确地提到了深度(2)。我的解决方案不是解决方案,只是她如何使用循环的一种方式,顺便说一句,当你不需要它们时,一切都是一个糟糕的主意。我在matlab中工作了很长时间,我知道有很多情况下,你无法逃避使用循环。事实上,逃避编程语言给你的巨大财富,只是愚蠢。我希望这有助于澄清一些观点,关键是这不需要使用循环,而您的答案表明它需要使用循环。事实上,如您所示,在这里使用循环(没有预分配)对于更大的阵列可能会非常低效。对不起,那是愚蠢的,纯粹而简单。声称您已经使用MATLAB很长一段时间是不相关的。许多人使用过一个工具,但从未学会如何很好地使用它。您需要将exp添加到您的解决方案中。。。我仍然认为bsxfun的杀伤力太大了