Java IntStream、Range 和 mapToDouble 以及 C# 中等效的 reduce 函数

标签 java c#

有人可以帮助我解决以下 Java 行的作用吗?或者你能给出一个 C# 等效于下面的代码行吗

  public static double[] logSumExp(List<Double> a, List<Double> b) {
    double amax = Collections.max(a);
    double sum = IntStream.range(0, a.size())
                     .mapToDouble(i -> Math.exp(a.get(i) - amax) * (i < b.size() ? b.get(i) : 1.0))
                     .reduce(0.0, Double::sum);
    double sign = Math.signum(sum);
    sum *= sign;
    double abs = Math.log(sum) + amax;
    double[] ret = {abs, sign};
    return ret;
  }

最佳答案

在 Java 中使用流的代码通常可以很好地转换为 .NET 中的 LINQ。
mapmapToXXXSelect , reduceAggregate ,但在这里Sum更方便。 IntStream.rangeEnumerable.Range .其他一切都应该有一个“明显的”等价物。

public static double[] LogSumExp(IList<double> a, IList<double> b) {
    double amax = a.Max();
    double sum = Enumerable.Range(0, a.Count)
                    .Select(i => Math.Exp(a[i] - amax) * (i < b.Count ? b[i] : 1.0))
                    .Sum();
    double sign = Math.Sign(sum);
    sum *= sign;
    double abs = Math.Log(sum) + amax;
    double[] ret = {abs, sign};
    return ret;
}

如果您使用的是 C# 7+,您应该真正返回一个元组:
public static (double abs, double sign) LogSumExp(IList<double> a, IList<double> b) {
    ...
    return (abs, sign);
}

关于Java IntStream、Range 和 mapToDouble 以及 C# 中等效的 reduce 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62249224/

相关文章:

c# - ASP.Net Core 自主机中的 SignalR

c# - 将数据从一个数据库复制到另一个数据库 - 内存不足异常

c# - 在不从前端发送 HTTP 请求的情况下获取 session 状态

java - Android dex 问题 : nested class + final boolean : com. android.dex.util.ExceptionWithContext

java - 构建检测自动装箱的工具?

c# - 首先使用代码查找带有 Entity Framework 时间戳的更新条目

c# - LINQ to SQL 实体列名称属性被 guid 主键忽略

java - 试图在表格布局中使表格行的高度相等

java - 我如何编译包含不同类型的源代码?

Java - 带有键、keyTitle、值、valueTitle 的映射