gpt4 book ai didi

Java - 接受标量和 vector 参数的函数/方法?

转载 作者:行者123 更新时间:2023-12-01 18:00:33 25 4
gpt4 key购买 nike

假设我有一个方程:

out = Math.exp(x);

其中x是一个double

假设我执行了 10,000 次,所以我将其放入函数中:

public double doMath(double x) {
return Math.exp(x);
}

很简单。我可以将任何标量传递给它:

double in = 1.1234;

out = doMath(in);

// Outputs something like: 1.1313368652

但是尝试向其传递 vector (一维数组、二维数组等...)会导致各种问题:

double[] in = {0.1234, 5.6789};

out = doMath(in);

// Outputs something like: IT DOESN'T OUTPUT! CRASH CRASH CRASH!

我想要的是能够传入任何 double (标量、1D、2D、3D 等)并返回与输入相同的大小,在将其传递给方程后,将算术应用于每个元素.

测试用例

double in = 0.1234;

/*
1.1313368652
*/

double[] in = {0.1234, 5.6789};

/*
[ 1.1313368652, 292.6273627191 ]
*/

double[][] in = {{0.1234, 5.6789},
{0.9876, 5.4321}};

/*
[ [ 1.1313368652, 292.6273627191 ]
[ 2.6847832542, 228.6288622608 ] ]
*/

double[][][] in = {{{0.1234, 5.6789}, {0.9876}},
{{5.4321}},
{{0}, {1}}};

/*
[ [ [ 1.1313368652 292.6273627191 ] [ 2.6847832542 ] ]
[ [ 228.6288622608 ] ]
[ [ 1 ] [ 2.7182818285 ] ] ]
*/

我现在唯一的方法是使用 overloading :

public double doMath(double x)

public double[] doMath(double[] x)

public double[][] doMath(double[][] x)

public double[][][] doMath(double[][][] x)

但这很乏味。是否可以编写一个函数来接受任何维度的参数,并返回与我提供的示例类似的内容?

也许这个有一个名字,但我只是不知道?这些都只是数组,但我将它们视为不同维度的矩阵(并对它们进行其他操作)。

编辑 #1 - 另外...

我尝试过类似的方法:

public double doMath(int... x)

它适用于标量和一维,但不适用于更高维度。

编辑#2

是否可以编写一个自定义类,自动处理多个函数的问题?

例如,假设我有三个不同的函数:

public mysteryClass firstFunct(mysteryClass x) {
return Math.pow(x, 2);
}

public mysteryClass secondFunct(mysteryClass x) {
return Math.exp(x);
}

public mysteryClass thirdFunct(mysteryClass x) {
return (1 + x) / 2;
}

每个函数都可以按原样使用 - - 具有任意数量的维度?然后,mysteryClass 会自动通过函数递归运行每个元素,而无需手动修改函数或循环每个元素?不确定对象是否有可能知道它是如何被使用的,并进行相应的调整。

提前致谢。

最佳答案

我不知道有什么内置方法可以做到这一点,但我有这样的方法:

public static Object applyAll(Object x) {
if (x instanceof Double) {
return doFunc((Double) x);
}
else if (x instanceof Object[]) {
List<Object> result = new ArrayList<>();
for (Object element : (Object[])x) {
result.add(applyAll(element));
}
return result.toArray(new Object[0]);
}
else {
throw new RuntimeException("Unexpected class: " + x.getClass());
}
}

applyAll 适用于 Double 或数组,如果它是数组,它会在元素上递归调用自身并构建结果数组。最终结果是最终结果的数组结构与最外层参数的结构匹配。但是,如果任何元素不是 Double 或数组,则会引发异常。 doFunc 是一种接受 doubleDouble 参数并返回 doubleDouble。您可以轻松地将函数作为参数传递(使用 Java 8 函数接口(interface)),而不需要定义 doFunc。在您的示例中,doFunc 将在其参数上返回 Math.exp

这可能不是最好的代码,但它可以工作。您实际上不需要构建列表然后转换为数组,因为数组的大小已经知道。但是,我没有尝试完善它。您可以根据需要随意改进或修改。

关于Java - 接受标量和 vector 参数的函数/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41339826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com