议论一下C#面向聚集的扩展 (转载)

3个月前 (11-26 17:17)阅读3回复0
xxhh
xxhh
  • 管理员
  • 注册排名4
  • 经验值129915
  • 级别管理员
  • 主题25983
  • 回复0
楼主

  议论一下C#面向聚集的扩展

  天翼空间开发者社区/

  我们晓得有良多数学软件,如MatLab是面向矩阵的,而开源语言R是面向向量的,SQL是面向关系系的、APL(Array processing language)是一种一种多用处、第三代(3GL)编程语言,在向量、矩阵等各类秩的数组处置上十分简单。SPSS,SAS等都需要大量的聚集运算。

  本文筹算从C#自己的特征动身,模仿C#面向聚集的办法。

  更期看C#面向聚集能向MatLab, APL,R那样间接处置聚集运算,进进科学和工程计算范畴,为以后的并行计算奠基根底。

  有一列看测值,用List存储,我们如今需要求出每一个看测值的正弦Sin值。

  用C#面向过程的语法表达如下:

  List list2; for (int i = 0; i list2.Count; i++) list2[i] = Math.Sin(list2[i]); 求Sin值,是一个繁琐而又反复的问题。我们期看Math.Sin(Collection c),在不改动已有代码(不扩展Math.Sin)的情状下,主动处置聚集,就像在MatLab里面。

  C#是面向过程的,而Matlab是面向矩阵的,SQL是面向关系代数的。关系代数和矩阵,都能够看做聚集的特例。(LINQ部门加进了面向聚集的特征)

  面向过程,需要法式员书写算法的每一个过程和细节,指明施行途径,那次要表示在轮回语句的利用上(包罗for, foreach, while…)。

  面向过程给了法式员最足够的自在和更大的乖巧,但其固有的“底层”,招致了开发效率的底下,同时倒霉于并行计算和系统优化。而在数学中,大部门计算都是基于矩阵(聚集),例如图形图像处置,概率论,数理统计,优化掌握等等。 所以C#难以胜任运算集中和常识处置,人工智能设想。

  因为C#其实是太斑斓,是目前最艺术的语言,操纵C#现有特征,我们能够简单的模仿前面提出的问题

  public static List Apply(Converter f, List l) { List list2 = new List(l); for (int i = 0; i list2.Count; i++) list2[i] = Math.Sin(list2[i]); for (int i = 0; i l.Count; i++) { list2[i] = f(l[i]); } return list2; } 如许,我们能够在Apply来处置一些关于聚集处置的问题。

  下面在给出一个处置矩阵的例子:

  public static Matrix Apply(Converter f, Matrix m) { Matrix m2 = new Matrix(m); for (int i = 0; i m.Row; i++) for (int j = 0; j m.Col; j++) m2[i, j] = f(m2[i, j]); return m2; } 利用那个Apply,能够处置矩阵聚集相关的计算。

  矩阵定义如下:

  public class Matrix { public double[,] data; public Matrix(int row, int col) { data = new double[row, col]; } //复造构造函数 public Matrix(Matrix m) { data = (double[,])m.data.Clone(); } public int Col { get { return data.GetLength(1); } } // 行数 public int Row { get { return data.GetLength(0); } } //重载索引 //存取数据成员 public virtual double this[int row, int col] { get { return data[row, col]; } set { data[row, col] = value; } } //维数 public int Dimension { get { return 2; } } public string ToString(int prec) { StringBuilder sb = new StringBuilder(); string format = "{0:F" + prec.ToString() + "} "; for (int i = 0; i Row; i++) { for (int j = 0; j Col - 1; j++) { sb.Append(string.Format(format, data[i, j])); } sb.Append(data[i, Col - 1]); sb.Append(""n"); } return sb.ToString(); } } 再看下面复数的例子:

  public static List Apply(Converter Complex,double f, List l) { List l2 = new List(l.Count); for (int i = 0; i l.Count; i++) l2.Add(f(l[i])); return l2; } 利用那个Apply,能够处置复数聚集相关的许多计算。

  复数类的定义如下:

  Code public class Complex:ICloneable { private double real; /**//// /// 复数的实部 /// public double Real { get { return real; } set { real = value; } } private double image; /**//// /// 复数的虚部 /// public double Image { get { return image; } set { image = value; } } /**//// /// 默认构造函数 /// public Complex() : this(0, 0) { } /**//// /// 只要实部的构造函数 /// /// 实部 public Complex(double real) : this(real, 0) { } /**//// /// 由实部和虚部构造 /// /// 实部 /// 虚部 public Complex(double r, double i) { rreal = r; iimage = i; } /**////重载加法 public static Complex operator +(Complex c1, Complex c2) { return new Complex(c1.real + c2.real, c1.image + c2.image); } /**////重载减法 public static Complex operator -(Complex c1, Complex c2) { return new Complex(c1.real - c2.real, c1.image - c2.image); } /**////重载乘法 public static Complex operator *(Complex c1, Complex c2) { return new Complex(c1.real * c2.real - c1.image * c2.image, c1.image * c2.real + c1.real * c2.image); } /**//// /// 求复数的模 /// /// 模 public double Modul { get { return Math.Sqrt(real * real + image * image); } } public static double Sin(Complex c) { return c.image / c.Modul; } /**//// /// 重载ToString办法 /// /// 打印字符串 public override string ToString() { if (Real == 0 Image == 0) { return string.Format("{0}", 0); } if (Real == 0 (Image != 1 Image != -1)) { return string.Format("{0} i", Image); } if (Image == 0) { return string.Format("{0}", Real); } if (Image == 1) { return string.Format("i"); } if (Image == -1) { return string.Format("- i"); } if (Image 0) { return string.Format("{0} - {1} i", Real, -Image); } return string.Format("{0} + {1} i", Real, Image); } ICloneable 成员#region ICloneable 成员 public object Clone() { Complex c = new Complex(real, image); return c; } #endregion } 畴前面三个例子,我们能够看出,C#面向聚集有多种表达体例,有.net框架中的List,也有自定义的Matrix,同时聚集的元素也是多种数据类型,有系统中的值类型,也有自定义的复数Complex类型。

  当然那种算法过于牵强,显然不是我们所需要的。

  我们需要的是一个在不更改现有语言的情状下,不扩大Math.Sin函数(试着想想有几个类似的函数,Cos, Tan, 我们本身定义的各类函数)。系统主动处置聚集。也就是说,关于函数 public delegate TOutput Converter(TInput input);public T1 Func(T2 e); Func是Converter的实例。只要Func可以处置原子类型,那么就能处置主动所有的原子类型构成的肆意聚集,而不需要法式员往写余外的代码。

  平台简介

  天翼空间是由面向用户的利用商城和面向开发者的利用工场(开发者社区)构成。

  天翼空间.利用工场是办事于天翼空间的开发者社区,为天翼空间的开发者办事。在天翼空间营业全流程中发掘聚合包罗手机软件开发者、最末用户、和API利用开发者等角色的原始需求,并根据原始需求逐渐将天翼空间本身包罗数据、客服、用户等一系列资本开放。并聚合一批API开发者将原始开放接口开发成成熟可用的利用,最末使手机利用开发者能愈加高效的通过天翼空间平台获取更多的最末用户。

  通过成立开发者社区全流程撑持平台旨在处理开发者在利用天翼空间时包罗客服,开发,测试,上架,开店等全流程中的利用问题,并通过论坛等交互式版块成立升引户的交互平台,最末到达进步用户称心度,进步开发者效率,为开发者办事的大旨。

  天翼空间才能开放特征

  1、开放接口丰富

  开放包罗利用商铺数据、电信级通信和基于云计算的才能开放等多种多样的办事和API接口,为开发者供给多种多样的办事和才能。

  2、挪用次数多

  丰富的API+开发者无限的创意=挪用频次高,开放平台挪用次数已到达均匀每日300万次。

  3、赚钱体例多

  才能开放平台旨在为开发者打造一个需乞降实现的桥梁,供给清晰且多样的盈利形式,与协做伙伴配合生长,协做共赢。

  4、协做形式开放

  以宽大、自在的立场、不竭的摸索新协做形式,不限语言、不限平台,驱逐广阔的互联网开发者,普遍的聚合互联网开发者的力量。

  开放平台营业

  1、天翼空间API

  中国电信天翼空间利用商铺将以天翼3G挪动互联网利用为核心,通过开放电信末端和收集才能,聚合强大的互联网才能,引领国内挪动互联网生活,带来3G无限超卓!

  中国电信天翼空间在国内初创“前店后厂”营业形式,努力于摸索电信才能与互联网才能的合成,以天翼空间利用工场为窗口率先开放了运营商的根底才能接口,聚合起大量协做伙伴,构成了一多量表现互联网与电信网合效果能的才能接口,才能开放与合成那两大主体是天翼空间区别于业界其他利用商铺的核心合作力。

  如:利用分类、利用详情、利用排行等

  2、电信才能API

  电信才能指电信开发的才能接口API接口的总称,也称电信API。

  API是供给利用法式与开发人员基于某软件或硬件的以拜候一组例程的才能,而又无需拜候源码,或理解内 部工做机造的细节。只需要做简单的代码嵌进,就可以实现诸多冗杂的电信才能,好比短信群发、多方语音 、在线点歌等。

  如:短信、语音、验证码、彩信等

  3、云计算API

  以中国电信云数据中心为支持,将可供给云计算主机治理平台、自办事门户治理平台、云数据治理中心以及云计算主机营业托管等相关的计算、存储及智能收集资本综合办事。吸引强大的开发者团队,构成引领国内挪动互联网生活的开发平台。

  如:分词API、QQ机器人、云图像处置等

  4、手机告白API

  我们将供给开放的手机告白平台,有效的整合法式开发者、网站发布者、告白商、代办署理机构,打造多条理、全方位的手机告白API办事,妥帖利用法式并实现盈利;供给多种告白格局、优良的告白资本、将网站的流量循序改变为现金;为品牌和绩效告白商供给高效切确的处理计划,以此来吸引您的目标受寡并提拔销量。手机告白API以一流的平台,绝佳的赞扬案办法,立异的告白形式,实现多方的互利共赢。

  如:Android法式SDK、Windows Mobile法式SDK、Brew法式SDK等

0
回帖

议论一下C#面向聚集的扩展 (转载) 期待您的回复!

取消