关于复数数组求和及相关数组创建与填充的技术咨询
复数数组求和的实现方案
嘿,针对你提到的System.Numerics.Complex数组求和需求,我给你整理了几种贴合你场景的实现方法,直接就能用:
1. 对单个复数数组的所有元素求和(得到单个复数结果)
如果你的需求是把ValeurPixelsExperiment或ValeurPixelsReference里的所有元素累加起来,得到一个总的复数结果,有两种简洁的实现方式:
循环方式(直观易调试)
// 计算ValeurPixelsExperiment的总和 System.Numerics.Complex totalExperiment = System.Numerics.Complex.Zero; foreach (var pixelComplex in ValeurPixelsExperiment) { totalExperiment += pixelComplex; } // 计算ValeurPixelsReference的总和同理 System.Numerics.Complex totalReference = System.Numerics.Complex.Zero; foreach (var pixelComplex in ValeurPixelsReference) { totalReference += pixelComplex; }
LINQ方式(代码更简洁)
先引用System.Linq命名空间,然后一行搞定:
using System.Linq; var totalExperiment = ValeurPixelsExperiment.Aggregate(System.Numerics.Complex.Zero, (accumulator, current) => accumulator + current); var totalReference = ValeurPixelsReference.Aggregate(System.Numerics.Complex.Zero, (accumulator, current) => accumulator + current);
2. 将短数组元素循环累加填充至长Sum数组
你的Sum数组长度是1024,原数组是132,大概率需要把原数组的元素循环迭代,逐步累加填充到长数组中。这里给你一个滚动累加的实现:
// 填充ValeurPixelsSumExperiment System.Numerics.Complex rollingSum = System.Numerics.Complex.Zero; for (int i = 0; i < ValeurPixelsSumExperiment.Length; i++) { // 用取模实现原数组的循环索引 rollingSum += ValeurPixelsExperiment[i % ValeurPixelsExperiment.Length]; ValeurPixelsSumExperiment[i] = rollingSum; } // 填充ValeurPixelsSumReference同理 rollingSum = System.Numerics.Complex.Zero; for (int i = 0; i < ValeurPixelsSumReference.Length; i++) { rollingSum += ValeurPixelsReference[i % ValeurPixelsReference.Length]; ValeurPixelsSumReference[i] = rollingSum; }
如果你的需求是把原数组的总和直接重复填充到Sum数组里,用Array.Fill更高效:
var totalExperiment = ValeurPixelsExperiment.Aggregate(System.Numerics.Complex.Zero, (acc, val) => acc + val); Array.Fill(ValeurPixelsSumExperiment, totalExperiment); var totalReference = ValeurPixelsReference.Aggregate(System.Numerics.Complex.Zero, (acc, val) => acc + val); Array.Fill(ValeurPixelsSumReference, totalReference);
3. 按索引扩展累加(前132位累加原数组,后续累加自定义值)
如果Sum数组前132位是原数组的逐步累加,后面的元素继续累加固定值(比如0),可以这样写:
// 先处理原数组长度内的元素 System.Numerics.Complex currentSum = System.Numerics.Complex.Zero; for (int i = 0; i < ValeurPixelsExperiment.Length; i++) { currentSum += ValeurPixelsExperiment[i]; ValeurPixelsSumExperiment[i] = currentSum; } // 处理剩余的元素,这里以累加0为例,可替换为你需要的数值 for (int i = ValeurPixelsExperiment.Length; i < ValeurPixelsSumExperiment.Length; i++) { currentSum += System.Numerics.Complex.Zero; ValeurPixelsSumExperiment[i] = currentSum; }
小提示
System.Numerics.Complex已经重载了+运算符,直接相加就会自动完成实部和虚部的分别累加,完全不用手动拆分计算。如果你的复数是从像素蓝色分量转换来的(虚部为0),求和逻辑和普通浮点数数组完全一致。
内容的提问来源于stack exchange,提问作者Trion
相关产品推荐
相关产品推荐

