java - For 循环和计算移动平均线

标签 java matlab for-loop

我正在尝试用 Java 重写 MATLAB 代码,但遇到了一个奇怪的问题。它只重复第一个值,但它会循环获取 ArrayList 的正确大小。

MATLAB 代码

function m = ema(x,N)
    L = length(x);
    m = zeros(L,1);
    w = 2/(N+1);
    m(1) = x(1);
    for i=2:L
        m(i) = w*(x(i)-m(i-1)) + m(i-1);
    end
end

Java代码

public static ArrayList<Double> getEma(ArrayList<Double> x, int frame) {
    ArrayList<Double> m = new ArrayList<>();
    double w = (2 / (frame + 1));

    m.add(x.get(0));

    for (int i=1; i < x.size(); i++) {
        double value = (w * (x.get(i) - m.get(i-1))) + m.get(i-1);
        m.add(value);
    }

    return m;
}

JUnit 测试结果

Expected :[23.11, 23.32, 23.78, 24.06, 24.29, 24.19, 23.82, 23.53, 23.63, 23.62, 23.41, 23.23, 23.51, 23.79, 24.13, 24.69, 25.05, 25.37, 25.53, 25.56, 25.84, 25.73, 25.88, 25.45, 25.01, 24.8, 24.44, 24.18, 24.58, 25.37]
Actual   :[23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11, 23.11]

最佳答案

将输入从intframe更改为doubleframe或将frame转换为double或将2 -> 2.01 -> 1.0 在计算 w 时自动转换为 double 型而不进行强制转换。

public static ArrayList<Double> getEma(ArrayList<Double> x, int frame) {
    ArrayList<Double> m = new ArrayList<Double>();
    double w = (2 / ((double) frame + 1));

    m.add(x.get(0));

    for (int i=1; i < x.size(); i++) {
        double value = (w * (x.get(i) - m.get(i-1))) + m.get(i-1);
        m.add(value);
    }

    return m;
}

关于java - For 循环和计算移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255717/

相关文章:

matlab - 如何附加到正在运行的 Matlab 脚本

Matlab:按升序对行进行排序但跟踪原始索引

java - For 循环未执行;

javascript - for 循环中的 for 循环? - JavaScript

Java Android - 为什么我的调试看不到类

java - 无法在 Android Studio 2.1.1 的 gradle.properties 文件中设置 JVM 参数 gradle

Matlab imshow 省略 NaN

javascript - 我的号码查询功能不起作用,为什么?

java - Spring @PropertySource 刷新

java - 是否调用 finish() ?