Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将一个数组中的每个元素减去另一个?_C#_Arrays_Linq_Math - Fatal编程技术网

C# 如何将一个数组中的每个元素减去另一个?

C# 如何将一个数组中的每个元素减去另一个?,c#,arrays,linq,math,C#,Arrays,Linq,Math,我有两个大小相等的数组 double[] array1; double[] array2; //array1 size == array2 size 我还有一个常数双常数=5。比如说5 我想创建一个新数组double[]array3我们取数组1中的每个元素,并从数组1中减去数组2中相同索引处的元素。 以便: array3[i]=array1[i]-array2[i] 然后我想减去数组3中所有元素的常数 我可以用for循环来完成这一切,但是我的数组非常大,所以需要很长时间来计算。有没有办法不使用

我有两个大小相等的数组

double[] array1;
double[] array2; //array1 size == array2 size
我还有一个常数
双常数=5
。比如说5 我想创建一个新数组
double[]array3我们取数组1中的每个元素,并从数组1中减去数组2中相同索引处的元素。
以便:

array3[i]=array1[i]-array2[i]

然后我想减去数组3中所有元素的常数

我可以用for循环来完成这一切,但是我的数组非常大,所以需要很长时间来计算。有没有办法不使用for循环而专门进行减法

示例数据:

如果:

然后

现在减去常数

array3 = {-4.1, -3.2, -2.3, - 1.4, -0.5, 0.4}

确实无法避免至少在阵列上循环一次,但是有一种内置的LINQ
Zip
方法可以为您完成大部分的艰苦工作

不要做的事情是循环超出必要范围,所以不要在进行初始减法后减去常量值——同时进行

var array1 = new[]{1, 2, 3, 4, 5, 6};
var array2 = new[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.6};
var constant = 5;
var array3 = array1.Zip(array2, (x,y) => x-y-constant).ToArray();
实例:

这最终会比简单的for循环慢一点

var array1 = new[]{1, 2, 3, 4, 5, 6};
var array2 = new[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.6};
var constant = 5;
var array3 = new double[array1.Length];
for(int i=0,j=array1.Length; i<j;i++)
    array3[i] = array1[i] - array2[i] - constant;
var array1=new[]{1,2,3,4,5,6};
var array2=新[]{0.1,0.2,0.3,0.4,0.5,0.6};
var常数=5;
var array3=新的双精度[array1.长度];

对于(int i=0,j=array1.Length;i如果顺序实际上并不重要,那么您可以使用
aspallel
使用PLINQ并行化您的
Zip

var array1 = new[]{1, 2, 3, 4, 5, 6};
var array2 = new[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.6};
var constant = 5;
var array3 = array1.AsParallel().Zip(array2.AsParallel(), (x,y) => x-y-constant);
因为它是并行发生的,所以结果将是无序的(但仍然是正确的)

编辑: 并行编译器是否比顺序编译器快取决于您的硬件和输入大小。对我来说,许多在线编译器(rextester、C#fiddle)显示顺序执行更快(很可能是因为它们的资源有限,输入大小不能太大),在我的本地计算机上,当输入大小接近每个数组约1000万个元素时,我可以看到并行执行变得更快。您可以选择“Benchmark,Benchmark,Benchmark”

Enumerable.Range(0,array1.Length)。选择(x=>array1[x]-array2[x]+常量);
使用


您可以执行
array1.Zip(array2,(x,y)=>x-y)
,但这并不一定比
for
循环快……“有没有一种方法可以专门执行减法而不使用for循环?”-在某个地方,您将需要在数组上循环-至少一次。如上所述,即使您没有显式地使用
for
循环,如果
array1
array2
的大小与您只能使用1
for
循环的大小相同,您最终也会在数组中循环(可能是内部循环,但仍然如此)。
(inti=0;i
,我看不出有任何理由不能在一次迭代中完成所有操作,减去数组值,并在每次迭代中减去const。有一个原因;但是,只有在需要执行的工作量很大的情况下,它才会加快速度。还有一个原因。
var array1 = new[]{1, 2, 3, 4, 5, 6};
var array2 = new[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.6};
var constant = 5;
var array3 = new double[array1.Length];
for(int i=0,j=array1.Length; i<j;i++)
    array3[i] = array1[i] - array2[i] - constant;
var array1 = new[]{1, 2, 3, 4, 5, 6};
var array2 = new[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.6};
var constant = 5;
var array3 = array1.AsParallel().Zip(array2.AsParallel(), (x,y) => x-y-constant);
double[] array1 = ...;
double[] array2 = ...;
const double value = 5.0;

var result = array1.Zip(array2, (x, y) => x - y - value);