C# C语言中的矢量化算子#

C# C语言中的矢量化算子#,c#,arrays,operators,C#,Arrays,Operators,我花了很多时间在R或MATLAB上编程。这些语言通常用于处理数组和矩阵,因此,它们具有用于加法、等式等的向量化运算符 例如,在MATLAB中,添加两个数组 [1.2 3.4 5.6] + [9.87 6.54 3.21] 返回相同大小的数组 ans = 11.07 9.94 8.81 切换到C#,我们需要一个循环,感觉像是有很多代码 double[] a = { 1.2, 3.4, 5.6 }; double[] b = { 9.87, 6.5

我花了很多时间在R或MATLAB上编程。这些语言通常用于处理数组和矩阵,因此,它们具有用于加法、等式等的向量化运算符

例如,在MATLAB中,添加两个数组

[1.2 3.4 5.6] + [9.87 6.54 3.21]
返回相同大小的数组

ans =
        11.07         9.94         8.81
切换到C#,我们需要一个循环,感觉像是有很多代码

double[] a = { 1.2, 3.4, 5.6 };
double[] b = { 9.87, 6.54, 3.21 };
double[] sum = new double[a.Length];
for (int i = 0; i < a.Length; ++i)
{
  sum[i] = a[i] + b[i];
}
问题是,由于数组类型不支持加法,所以不能像

double[] sum = Operator<double[]>.Add(a, b);  // Throws InvalidOperationException
double[]sum=运算符。添加(a,b);//抛出无效操作异常
我已经没有主意了。你能想出任何可行的方法吗?

创建一个向量类(实际上我会把它变成一个结构)并重载该类的算术运算符。。。这可能已经完成了,如果你做谷歌搜索,有很多点击。。。这是一个看起来很有前途的

要处理任意维的向量,我需要:

  • 设计内部数组,该数组将为每个 向量维度值任意大小的数组列表
  • 使向量构造函数将维度作为构造函数参数
  • 在“算术运算符重载”中,添加一个验证,验证所加或减的两个向量具有相同的维数

  • 看一看。这是一个相当完整的c#矩阵库。我已经用它做了一些事情,而且效果很好。

    您可能应该创建一个向量类,在内部包装数组并重载算术运算符。有一个像样的

    但如果出于某种原因确实需要在裸阵列上操作,则可以使用LINQ:

    var a1 = new double[] { 0, 1, 2, 3 };
    var a2 = new double[] { 10, 20, 30, 40 };
    
    var sum = a1.Zip( a2, (x,y) => Operator<double>.Add( x, y ) ).ToArray();
    
    vara1=newdouble[]{0,1,2,3};
    var a2=新的双[]{10,20,30,40};
    var sum=a1.Zip(a2,(x,y)=>Operator.Add(x,y)).ToArray();
    
    具有您可以使用的类。您可以像.NET的任何其他部分一样在应用程序中使用它。只要抓起密码就行了


    顺便说一句,在应用程序中使用它不需要做任何特殊的事情(如获得游戏工作室或加入创建者俱乐部)。

    有很多模板库,主要用于图形,处理向量和矩阵代数,您可能希望朝这个方向看。他们通常也使用运算符重载,这使它更具可读性。谢谢,但我是否仍然需要创建大量派生类(DoubleVector、IntVector、BoolVector等),因为object+object deosn不起作用。@peSHIr:这将是理想的,但在Add(ta,tb)方法中,您必须使用例如for(I…{sum)来添加单个元素[i] =(T)a[i]+(T)b[i];},即添加两个类型为T的对象,但没有编译。干杯。我最近才升级到使用3.5框架,并且一直推迟学习LINQ。我想这就是我选择它的原因。快速问题:Zip方法从何而来?Zip可用于MoreLINQ库(参见URL)或者使用.NET 4.0。这是合并两个序列的最简单方法。MoreLINQ:这似乎非常有用。它通过将所有内容存储为“复杂”值的ArrayList(实际上是一对双精度)的ArrayList来解决处理不同类型的问题。
    var a1 = new double[] { 0, 1, 2, 3 };
    var a2 = new double[] { 10, 20, 30, 40 };
    
    var sum = a1.Zip( a2, (x,y) => Operator<double>.Add( x, y ) ).ToArray();