为使用矩阵的先前值的 Matlab 矩阵操作查找等效的 LINQ 查询

我想使用 LINQ 简化 C# 中 List 的生成。我的目标是使用另一个 List 的值使用操作填充新 List。我愿意使用第三方库,如Deedle或MathNet,如果它们可以重现与我当前解决方案类似的性能。


在 Matlab 中实现目标的等效方法是使用简单的矩阵运算和点运算,如以下代码所示:dailyRetList = (dailyCloseList(2:end) - dailyCloseList(1:end-1))./dailyCloseList(1:end-1)


这将创建一个新数组,迭代并为每个元素从中减去,然后将结果除以,最后将值推送到新创建的数组。dailyCloseListdailyCloseList[i-1]dailyCloseList[i]dailyCloseList[i-1]


我目前解决这个问题的解决方案是:


var dailyCloseList = new List<double>{11.8d, 11.7d, 13d, 12.6d, 15d};


var dailyRetList = new List<double>();

for (var i = 1; i < dailyCloseList.Count; i++)

{

     dailyRetList.Add((dailyCloseList[i] - dailyCloseList[i-1])/dailyCloseList[i-1]);

}


ITMISS
浏览 132回答 3
3回答

尚方宝剑之说

你可以在 Linq 中使用它:var&nbsp;m&nbsp;=&nbsp;Enumerable.Range(1,&nbsp;dailyCloseList.Count&nbsp;-&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Select(i&nbsp;=>&nbsp;(dailyCloseList[i]&nbsp;-&nbsp;dailyCloseList[i&nbsp;-&nbsp;1])/&nbsp;dailyCloseList[i&nbsp;-&nbsp;1]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToList();检查异常总是有帮助的。DivideByZero

慕姐8265434

另一种选择是使用:Zipvar&nbsp;change&nbsp;=&nbsp;dailyCloseList.Zip(dailyCloseList.Skip(1)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Select((x,y)&nbsp;=>&nbsp;(y&nbsp;-&nbsp;x)/x) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToList();

蓝山帝景

我认为最林克的方式是这个var dailyRetList = dailyCloseList&nbsp; &nbsp; .ConsecutivePairs((a, b) => (b - a) / a)&nbsp; &nbsp; .ToList();当然,你必须定义函数(曾经在某个地方)。但与 Guaravsa 解决方案不同,它适用于 ,因此不需要直接索引访问。但这一切都是有代价的。您最初的简单循环比任何使用枚举的解决方案快3倍左右(顺便说一句,您应该在开始时预先分配List以获得最佳性能)。ConsecutivePairsIEnumerable函数实现,只是为了完整性:public static IEnumerable<Q> ConsecutivePairs<T, Q>(this IEnumerable<T> sequence, Func<T, T, Q> selector){&nbsp; &nbsp; using(var en = sequence.GetEnumerator())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (!en.MoveNext()) { yield break; }&nbsp; &nbsp; &nbsp; &nbsp; T prev = en.Current;&nbsp; &nbsp; &nbsp; &nbsp; while (en.MoveNext())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield return selector(prev, en.Current);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prev = en.Current;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP