【问题标题】:Passing a java function as a parameter将 java 函数作为参数传递
【发布时间】:2015-05-12 07:06:30
【问题描述】:

我在我的 java 应用程序中使用 Wolfram Mathematica 9.0。问题是我需要生成一个很长的表达式(比如 1.2 * (x-1) + 1.25 * (x-1.5) + ...等)作为一个函数,并且需要很长时间来构建它字符串生成器。有什么方法可以在不将其转换为 wolfram 表达式的情况下传递 java 函数?

更新

这个功能就是我要说的。它构建了 wolfram 函数表达式。通常arr长度大于100000。

public static String buildCdfExpressionForWolfram(double [] arr){

    StringBuilder strBuilder = new StringBuilder();

    int n = arr.length;
    strBuilder.append("(");
    for(int i = 0; i < n; i++){
        strBuilder.append("HeavisideTheta[x");
        if(arr[i] > 0) {
            strBuilder.append("-");
            strBuilder.append(arr[i]);
        }
        else if(arr[i] < 0){
            strBuilder.append("+");
            strBuilder.append(-arr[i]);
        }
        strBuilder.append("]");
        if(i != n - 1){
            strBuilder.append("+");
        }
    }

    strBuilder.append(") / " + n);


    return strBuilder.toString();
}

【问题讨论】:

  • “很长一段时间”有多长?
  • 请说明您现在的工作方式。也许通过代码 sn-p。
  • 很长的时间大约是20-30秒。问题是这段时间花在构建表达式而不是计算上,在我看来这很不合逻辑。

标签: java wolfram-mathematica


【解决方案1】:

如果减少append 的调用量会怎样?

public static String buildCdfExpressionForWolfram(double [] arr){

    StringBuilder strBuilder = new StringBuilder("(");

    int n = arr.length;
    for(int i = 0; i < n; i++){
        if(arr[i] > 0) {
            strBuilder.append("HeavisideTheta[x-"+arr[i]+"]");
        }
        else if(arr[i] < 0){
            strBuilder.append("HeavisideTheta[x+-"+arr[i]+"]");
        }
        if(i != n - 1){
            strBuilder.append("+");
        }
    }

    strBuilder.append(") / " + n);


    return strBuilder.toString();
}

【讨论】:

  • 我想,+ 运算符调用并不比追加调用好多少。
  • 你能调试一下看看哪一行有问题吗?我已经看到使用 stringbuilder 不到一分钟的数组长度的基准测试
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 2020-05-13
  • 2013-05-23
  • 2016-11-22
  • 2016-10-14
  • 2021-04-13
  • 2023-04-02
相关资源
最近更新 更多