java - MATLAB 不能从 Java 读回 double[] 数组吗?

标签 java arrays matlab variables pass-by-reference

考虑 MyClass.java:

public class MyClass {
  public void firstfunction(double fwd[]) {
   fwd[0] = 42;
  }
  public void secondfunction(Double fwd[]) {
   fwd[0] = new Double(42);
  }
}

这两个函数都在 fwd 中返回值 42,对吗?

我想从 MATLAB 中访问这个值 42:

myobj=MyClass;
var1=0.0;
myobj.firstfunction(var1);
fprintf('%1.1f',var1);         %// ... var1 is still 0.0 ...       :-(

var2 = javaArray ('java.lang.Double',1);
var2(1)=java.lang.Double(0.0);
myobj.secondfunction(var2);    %// var2 now contains the value 42  :-)

虽然都调用了“work”(原样:没有错误消息),但只有 var2 包含返回值 42; var1 的值仍然是 0.0。

有什么方法可以使用 MATLAB 调用函数 firstfunction 并检索返回值?


一些背景:MATLAB 可以在调用 Java 函数时传递 Java 对象,并且随后可以在 MATLAB 中对这些对象进行修改 - except 当 Java 对象是数组时原始数据类型。在这种情况下,MATLAB 和 Java 之间的自动转换启动,使 Java 基本 double 组直接对应于 MATLAB 中的 double 矩阵——根据 MA​​TLAB 约定,这是“作为值传递”的东西,因此不可能有返回值。所以我的问题可以改写为有什么办法解决这个问题吗?


(你可以在这里停止阅读。)

作为引用,我的特例是这样的:

我有一个 Java 类 MyClass.java 包装了一个 DLL,我想在 MATLAB 中使用它。但是,其中一个函数的返回值是作为参数传递的double[],由于交互方式,其内容不会返回 MATLAB用 Java 实现。

有没有办法解决这个问题,而不修改 DLL 返回数据的方式?

这是丑陋的细节:

public class MyClass
{
    static
    {
        System.load("C:\\fullpath\\mydll.dll");
    }
public static native long   SetFWD(double fwd);
public static native long   GetFWD(double fwd[]);
}

一旦我正确设置了 javapath,这在 MATLAB 中是可见的:

>> methods MyClass -full

Methods for class MyClass:

static long GetFWD(double[])
MyClass()
static long SetFWD(double)
[and stuff inherited from java.lang.Object]

我可以从 MATLAB 中调用函数 SetFWD,但我无法让 GetFWD 返回任何内容:

myobj=MyClass;
fwd=3.0;
myobj.SetFWD(fwdval); % this works fine
fwd=0.0;
myobj.GetFWD(fwd); % this does not give an error, but fwd stays unmodified - as one would expect in MATLAB
fwd = javaArray ('java.lang.Double',1);
fwd(1) = java.lang.Double(0.0);
myobj.GetFWD(fwd) % this gives the error "??? No method 'GetFWD' with matching signature found for class 'MyClass'."

来自阅读 MATLAB 文档 Passing Data to a Java MethodWorking with Java Arrays以及 SO 帖子 Moving from Java types back to MATLAB typesStrange classes passed from matlab to java ,我知道 Matlab 会自动将我传递给函数的任何 double 组转换为 Java 数组,然后忽略对这些数组所做的任何修改。似乎如果我在 MyClass 中的函数定义包含 Double 对象而不是 double 基元,我的第二次尝试就可以成功。

有没有办法让 MATLAB 返回我想要的值,而不修改原始 .DLL (mydll.dll)?

更新

我知道 MATLAB 通常“按值”传递所有内容。但是在Passing Data to a Java Method Mathworks 是这么说的

If you need to access changes that a Java method makes to an array, then, rather than passing a MATLAB array, you should create and pass a Java array, which is a reference.

他们在 Working with Java Arrays 中解释如何使用 javaArray 函数做到这一点,但我无法让它用于创建数组 double[](即原始 double 组),仅适用于 Double[](即 Double 对象数组)不是我在这里需要什么,因为我的函数 GetFWD() 不吃后者:-(。

>> A=javaArray ('java.lang.double',1); % works fine, but cannot be used as parameter for my function GetFWD (see "No Method ... with matching signature..." error above)
>> A=javaArray ('double',1);
??? Error using ==> javaArray
No class double can be located on the MATLAB Java classpath

最佳答案

不,它不能。

我找到了这个解决方法,我可以接受:虽然我不能(我自己)修改 DLL,但我可以在 java 中添加一个包装函数类 MyClass,像这样:

public static long  GetFWDwrp(Double fwd[]) {
    double tmp[]=new double[1];
    long retval = MyClass.GetFWD(tmp);      
    fwd[0] = tmp[0];
    return retval;
}

这个包装函数有一个 Double 对象数组作为参数,我可以像这样从 MATLAB 访问它:

oldFW = javaArray ('java.lang.Double',1);
oldFW(1)=java.lang.Double(0.0);
myobj.GetFWDwrp(oldFW);
oldFW % this now contains the return value

所以这回答了我关于问题的解决方法的问题,因为它不涉及更改 DLL 的接口(interface)(仅 Java 类的接口(interface))。

然而,标题中更基本的问题仍未得到解答:在 MATLAB 中是否真的不可能将对 array-of-primitive-double 的引用传递给 Java 函数,绕过自动将 Matlab-double-array 转换为 Java-primitive-double-array 并返回,这似乎使得无法访问 Java 代码对此类数组所做的任何更改。

关于java - MATLAB 不能从 Java 读回 double[] 数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5554518/

相关文章:

Java:不添加负值

java - 如何通过点击生成新 Activity

java - 代码可以在 Netbeans 中运行,但不能在 TextPad 中运行?

javascript - 在 JavaScript 中创建一个 n 维数组

java - 在递归中查找Java字符串数组的无序序列

matlab - 如何测试最新版本的 MATLAB?

matlab - Matlab等待栏-关闭所有不起作用

java - @OneToOne 与 CascadeType.ALL 没有被删除?

java - 用Java解析文本文件

matlab - 如何创建带有轮廓边框的矩形?