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

时间:2015-06-30 20:09:29

标签: c# arrays

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

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

  2. 我发现很难用复杂的数学方程式(第32/33行)来表示它们在括号中并且相互分开,是否有正确的方法来做到这一点?

  3. 如何在分区等元素上执行数学函数并将结果存储在同一个数组中?

  4. 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   
    

1 个答案:

答案 0 :(得分:2)

C#中存在很多陷阱,但解决问题是找到并学习它们的好方法!

  1. 是的,将参数传递给方法时,正确的语法是MethodName(varType varName),用逗号分隔多个参数。这里出现了一些陷阱,传递Value类型和Reference类型有所不同。如果您有兴趣here,请阅读相关内容。
  2. 编辑:正如评论中所指出的那样,您应该尽可能地编写代码以尽可能少地评论(因此在#3和#4之间的段落),但是如果您需要做非常具体且稍微复杂的数学,那么你应该评论澄清发生了什么。 如果您的理解有困难,请确保正确评论您的代码。如果你的意思是写它有困难,你可以创建变量来简化你的代码阅读(但通常是不必要的)或者查找函数或库来帮助你,如果你有一个特定的功能,或许我们正在寻找,这是一个有点开放的问题可能会有更多的帮助。
  3. 您可以通过array[i]等索引访问您的数组,获取第i个索引。在此之后,您可以以任何方式操纵所述索引所指向的数据,array[i] = (array[i]/24)^3array[i] = doMath(array[i])
  4. 如果您想要清理一些,但是它们是基于偏好的,您可以执行几项操作,在使用int CI; int k;初始化它们之前未在代码中声明int k = 2;,则没有必要(虽然你可以,如果它可以帮助你)。另一件事是正确命名你的变量,通常的做法是更具描述性的camelCase命名,所以也许你可以使用int CI = datay.ToList().IndexOf(maxValue);来代替int indexMaxValueYData = datay.ToList().IndexOf(maxValue);

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