为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
ITMISS 2022-08-20 15:17:46
我想使用 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]);}
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

你可以在 Linq 中使用它:

var m = Enumerable.Range(1, dailyCloseList.Count - 1)
                .Select(i => (dailyCloseList[i] - dailyCloseList[i - 1])/ dailyCloseList[i - 1])
                .ToList();

检查异常总是有帮助的。DivideByZero


查看完整回答
反对 回复 2022-08-20
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

另一种选择是使用:Zip

var change = dailyCloseList.Zip(dailyCloseList.Skip(1))
                           .Select((x,y) => (y - x)/x)
                           .ToList();


查看完整回答
反对 回复 2022-08-20
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

我认为最林克的方式是这个


var dailyRetList = dailyCloseList

    .ConsecutivePairs((a, b) => (b - a) / a)

    .ToList();

当然,你必须定义函数(曾经在某个地方)。但与 Guaravsa 解决方案不同,它适用于 ,因此不需要直接索引访问。但这一切都是有代价的。您最初的简单循环比任何使用枚举的解决方案快3倍左右(顺便说一句,您应该在开始时预先分配List以获得最佳性能)。ConsecutivePairsIEnumerable


函数实现,只是为了完整性:


public static IEnumerable<Q> ConsecutivePairs<T, Q>(this IEnumerable<T> sequence, Func<T, T, Q> selector)

{

    using(var en = sequence.GetEnumerator())

    {

        if (!en.MoveNext()) { yield break; }

        T prev = en.Current;

        while (en.MoveNext())

        {

            yield return selector(prev, en.Current);

            prev = en.Current;

        }

    }

}


查看完整回答
反对 回复 2022-08-20
  • 3 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号