有人可以帮我解决以下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。
mapmapToXXX的工作方式类似于SelectreduceAggregate,但是在这里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 - Java IntStream,Range和mapToDouble并在C#中减少等效功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62249224/

10-11 04:38
查看更多