C#中新用户的陷阱.(FWHM计算)
本文关键字:陷阱 FWHM 计算 用户 新用户 | 更新日期: 2023-09-27 18:00:42
我的想法是编写一个可以从另一个主程序调用的简单数学模块(函数)。它计算曲线的FWHM(最大值一半的全宽)。因为这是我第一次尝试使用Visual Studio和C#。我想知道一些我应该在C#中学习的基本编程结构,这些结构来自Mathematica背景。
-
是否double fwhm(double[]data,int c)指示输入参数对于该函数,fwhm应该是一个双数据数组和一个Integer价值我说对了吗?
-
我发现很难表达复杂的数学方程(第32/33行),用括号表达它们,然后一个接一个地除,正确的方法是什么?
-
如何对数组中的元素执行类似除法的数学函数,并将结果存储在同一个数组中?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DEV_2
{
class fwhm
{
static double fwhm(double[] data, int c) // data as 2d data and c is integer
{
double[] datax;
double[] datay;
int L;
int Mag = 4;
double PP = 2.2;
int CI;
int k;
double Interp;
double Tlead;
double Ttrail;
double fwhm;
L = datay.Length;
// Create datax as index for the number of elemts in data from 1-Length(data).
for (int i = 1; i <= data.Length; i++)
{
datax[i] = (i + 1);
}
//Find max in datay and divide all elements by maxValue.
var m = datay.Length; // Find length of datay
Array.ForEach(datay, (x) => {datay[m++] = x / datay.Max();}); // Divide all elements of datay by max(datay)
double maxValue = datay.Max();
CI = datay.ToList().IndexOf(maxValue); // Push that index to CI
// Start to search lead
int k = 2;
while (Math.Sign(datay[k]) == Math.Sign(datay[k-1]-0.5))
{
k=k+1;
}
Interp = (0.5-datay[k-1])/(datay[k]-datay[k-1]);
Tlead = datax[k-1]+Interp*(datax[k]-datax[k-1]);
CI = CI+1;
// Start search for the trail
while (Math.Sign(datay[k]-0.5) == Math.Sign(datay[k-1]-0.5) && (k<=L-1))
{
k=k+1;
}
if (k != L)
{
Interp = (0.5-datay[k-1])/(datay[k]-datay[k-1]);
Ttrail = datax[k-1] + Interp*(datax[k]-datax[k-1]);
fwhm =((Ttrail-Tlead)*PP)/Mag;
}
}//end main
}//end class
}//end namespace
C#中有很多陷阱,但解决问题是发现和学习它们的好方法!
- 是的,当将参数传递给方法时,正确的语法是
MethodName(varType varName)
,用逗号分隔多个参数。由于传递Value类型和Reference类型的差异,这里会出现一些陷阱。如果你感兴趣的话,这里有一些关于这个主题的读物 - 编辑:正如评论中所指出的,你应该尽可能好地编写代码,要求尽可能少的评论(因此第3段和第4段之间),然而,如果你需要做非常具体和稍微复杂的数学运算,那么你应该评论以澄清发生了什么。如果您的意思是理解困难,请确保正确地注释代码。如果你的意思是写它有困难,你可以创建变量来简化代码的阅读(但通常是不必要的),或者查找函数或库来帮助你,这是一个有点开放的问题。如果你有一个你正在寻找的特定功能,也许我们可以提供更多帮助
- 您可以通过索引(如
array[i]
)访问数组。2将获得第i个索引。在此之后,您可以以任何方式操作所述索引指向的数据,array[i] = (array[i]/24)^3
或array[i] = doMath(array[i])
如果你想稍微清理一下,你可以做一些事情,但它们是基于偏好的,就是在用int k = 2;
初始化它们之前,不要在代码中声明int CI; int k;
,这是没有必要的(尽管如果有帮助的话,你可以)。另一件事是正确命名变量,通常的做法是更具描述性的camelCase命名,所以也许可以使用int indexMaxValueYData = datay.ToList().IndexOf(maxValue);
而不是int CI = datay.ToList().IndexOf(maxValue);
- 根据您的评论问题"这个方法会返回什么?"该方法将返回一个double,如上所述。
returnType methodName(parameters)
然而,您需要在代码中添加它,到目前为止,我看不到返回行。例如return doubleVar;
,其中doubleVar是double类型的变量