有人可以帮我解决以下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。map
或mapToXXX
的工作方式类似于Select
,reduce
是Aggregate
,但是在这里Sum
更方便。 IntStream.range
是Enumerable.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/