【问题标题】:matrix of exponentially declining values according to a given vector根据给定向量呈指数下降的值矩阵
【发布时间】:2012-11-15 00:14:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 是公式: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。也许担心横向

标签: matlab vector matrix


【解决方案1】:

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

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×1×k 和 1×n×k),或者如果向量被转置(例如 1×m 和 n×1)。下面的解决方案很好地展示了良好的线性代数技能,尽管您可能想添加一个注释,为什么您不使用两个向量 initialRadexp 语句的点乘法。

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

【讨论】:

  • 您需要将 exp 添加到您的解决方案中......我仍然认为 bsxfun 是矫枉过正
【解决方案2】:

你应该使用循环,

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

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

【讨论】:

  • Matlab 的唯一目的不应该只是不写循环,事实上在迭代递归解决方案中除了使用循环别无他法。
  • 对于不需要它们的问题,循环通常不是一个好主意。更糟糕的是,如果确实使用循环,则不预先分配数组,然后导致数组的大小增长。那是相当低效的。学习预分配这些数组。并学习如何在不使用循环的情况下解决问题。您的代码将会改进。
  • 我还要注意您的“解决方案”实际上是不正确的,因为它明确引用了 depth(2)。
  • 我的解决方案不是解决方案,只是她如何使用循环的一种方式,顺便说一句,当你不需要它们时,一切都是一个糟糕的主意。我用 matlab 工作了很长时间,我知道在很多情况下你无法使用循环来逃避。事实上,逃避编程语言为您提供的重要资产只是愚蠢的。我希望它有助于澄清一些观点。
  • 重点是这不需要使用循环,而您的回答表明它确实如此。事实上,在这里使用循环(没有预分配)对于较大的数组可能非常低效。对不起,那是愚蠢的,纯粹而简单的。声称您使用 MATLAB 很长时间是无关紧要的。许多人在使用工具之前从未学会如何使用它。
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多