我的想法是编写一个可以从另一个主程序调用的简单数学模块(函数)。它计算曲线的FWHM(最大值的一半)。因为这是我第一次尝试使用Visual Studio和C#。我想知道我在C#中应该从Mathematica背景中学到的几个基本编程结构。
是否为双fwhm(double []数据,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
答案 0 :(得分:2)
C#中存在很多陷阱,但解决问题是找到并学习它们的好方法!
MethodName(varType varName)
,用逗号分隔多个参数。这里出现了一些陷阱,传递Value类型和Reference类型有所不同。如果您有兴趣here,请阅读相关内容。array[i]
等索引访问您的数组,获取第i个索引。在此之后,您可以以任何方式操纵所述索引所指向的数据,array[i] = (array[i]/24)^3
或array[i] = doMath(array[i])
如果您想要清理一些,但是它们是基于偏好的,您可以执行几项操作,在使用int CI; int k;
初始化它们之前未在代码中声明int k = 2;
,则没有必要(虽然你可以,如果它可以帮助你)。另一件事是正确命名你的变量,通常的做法是更具描述性的camelCase命名,所以也许你可以使用int CI = datay.ToList().IndexOf(maxValue);
来代替int indexMaxValueYData = datay.ToList().IndexOf(maxValue);
returnType methodName(parameters)
但是您需要在代码中添加它,截至目前我看不到返回行。例如return doubleVar;
其中doubleVar是double类型的变量。