使用之前和之后的值来分析所需值::: 辐射校准 - 条纹
Posted
技术标签:
【中文标题】使用之前和之后的值来分析所需值::: 辐射校准 - 条纹【英文标题】:Using value before and after to analyze desired value::: Radiometric Calibration - Streaking 【发布时间】:2012-07-17 14:32:48 【问题描述】:假设我有一个 1x15 的数据表
[21 78 33 59 90 26 88 54 36 63 72 37 48 93 56]
所以对于我的裸奔方程,我需要实现这个:
% 条纹 = [abs(Q_n - ((Q_n-1 + Q_n+1)/2))] / ((Q_n-1 + Q_n+1)/2)))*100
方程解释:
让我们将值 90 分配给 Q_n(这来自单元格 (1,5)) (所以本质上是 (1,4) 之前的单元格和 (1,6) 之后的单元格)
Q_n = 90
Q_n-1 = 59
Q_n+1 = 26
我的问题是:我将如何对整个数据集执行此操作并将它们应用于条纹方程? (不包括第 1 行和第 15 行,因为第 1 行不能有 Q_n-1,第 15 行不能有 Q_n+1)
我在想一些事情可能是这样的:
Q_n = 1;
while Q_n < length(middle.middle_interpolate)
Q_n = Q_n+1;
before = middle.middle_interpolateQ_n-1;
actual = middle.middle_interpolateQ_n;
after = middle.middle_interpolateQ_n+1;
averg = ((before + after)/2);
equation = (abs(actual-averg)/averg)*100;
plot(equation);
end
【问题讨论】:
为什么使用单元格而不是矩阵?如果你输入一个向量,你可以在没有循环的情况下做任何事情。主要问题似乎是在最后一次迭代中“Q_n==length(input)”并且您访问了“Q_n+1”。只需将您的边界更改为 '我把它分成几部分,这样你就可以看到我在做什么。它也只适用于这个特定的数据集,因为索引是硬编码的(但我敢打赌,你可以弄清楚如何让它适用于你拥有的任何数据集)。
averg = mean([Qn(1:13),Qn(3:15)],2); % this is just getting your averg value.
actual = Qn(2:14);
equation = abs(actual-averg)./averg*100;
plot(equation)
当然,你可以把这一切放在一行上,让它看起来非常复杂......
equation = abs(mean([Qn(1:13),Qn(3:15)],2) - Qn(2:14))./mean([Qn(1:13),Qn(3:15)],2)*100
但您想让它在未来可能会查看代码的其他人可读。
【讨论】:
所以 13 仅比最大计数低 2,所以我可以为我的实际数据做一些类似 length(data) - 2 的事情?以及仅将 15 替换为 length(data) ,然后将 14 替换为 length(data) -1 ? 那是正确的,如果它只是一个 1xn 向量,您可以使用end
而不是 length(data)
好的,所以我在 matlab 论坛上提交了另一个答案,看起来这两个都在做同样的事情,唯一的差异是你的答案从第 1 行开始,而另一个应用一个 NaN (因为我解释了为什么它不能用于引用第一行和最后一行)。无论如何,非常感谢您如此快速而明确的回复。
完全没问题。如果您想尝试考虑第一个和最后一个位置的数据,您总是可以用一些值填充矩阵。您可以通过 Matlab 对 padarray
函数的帮助找到一些相关信息,或者仅使用该逻辑并制作自己的焊盘,因为您实际上只需要焊盘顶部和底部。
实际上很好,你的没有包含 NaN,因为我正在寻找最大值,我可以快速浏览变量的工作区中的 max 列并得到我想要的做。以上是关于使用之前和之后的值来分析所需值::: 辐射校准 - 条纹的主要内容,如果未能解决你的问题,请参考以下文章