C#中新用户的陷阱.(FWHM计算)

本文关键字:陷阱 FWHM 计算 用户 新用户 | 更新日期: 2023-09-27 18:00:42

我的想法是编写一个可以从另一个主程序调用的简单数学模块(函数)。它计算曲线的FWHM(最大值一半的全宽)。因为这是我第一次尝试使用Visual Studio和C#。我想知道一些我应该在C#中学习的基本编程结构,这些结构来自Mathematica背景。

  1. 是否double fwhm(double[]data,int c)指示输入参数对于该函数,fwhm应该是一个双数据数组和一个Integer价值我说对了吗?

  2. 我发现很难表达复杂的数学方程(第32/33行),用括号表达它们,然后一个接一个地除,正确的方法是什么?

  3. 如何对数组中的元素执行类似除法的数学函数,并将结果存储在同一个数组中?


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#中新用户的陷阱.(FWHM计算)

C#中有很多陷阱,但解决问题是发现和学习它们的好方法!

  1. 是的,当将参数传递给方法时,正确的语法是MethodName(varType varName),用逗号分隔多个参数。由于传递Value类型和Reference类型的差异,这里会出现一些陷阱。如果你感兴趣的话,这里有一些关于这个主题的读物
  2. 编辑:正如评论中所指出的,你应该尽可能好地编写代码,要求尽可能少的评论(因此第3段和第4段之间),然而,如果你需要做非常具体和稍微复杂的数学运算,那么你应该评论以澄清发生了什么。如果您的意思是理解困难,请确保正确地注释代码。如果你的意思是写它有困难,你可以创建变量来简化代码的阅读(但通常是不必要的),或者查找函数或库来帮助你,这是一个有点开放的问题。如果你有一个你正在寻找的特定功能,也许我们可以提供更多帮助
  3. 您可以通过索引(如array[i])访问数组。2将获得第i个索引。在此之后,您可以以任何方式操作所述索引指向的数据,array[i] = (array[i]/24)^3array[i] = doMath(array[i])

如果你想稍微清理一下,你可以做一些事情,但它们是基于偏好的,就是在用int k = 2;初始化它们之前,不要在代码中声明int CI; int k;,这是没有必要的(尽管如果有帮助的话,你可以)。另一件事是正确命名变量,通常的做法是更具描述性的camelCase命名,所以也许可以使用int indexMaxValueYData = datay.ToList().IndexOf(maxValue); 而不是int CI = datay.ToList().IndexOf(maxValue);

  1. 根据您的评论问题"这个方法会返回什么?"该方法将返回一个double,如上所述。returnType methodName(parameters)然而,您需要在代码中添加它,到目前为止,我看不到返回行。例如return doubleVar;,其中doubleVar是double类型的变量