Может ли MATLAB не считывать массив double [] из Java?

Рассмотрим MyClass.java:

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

Обе функции возвращают значение 42 в fwd , верно?

Из 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  :-)

Хотя оба вызова «работают» (как есть: нет сообщения об ошибке), только var2 содержит возвращаемое значение 42; var1 по-прежнему имеет значение 0,0.

Есть ли способ использовать MATLAB для вызова функции firstfunction и получения возвращаемого значения?


Некоторая предыстория: MATLAB может передавать объекты Java при вызове функции Java и вносить изменения в эти объекты впоследствии доступны в MATLAB - , за исключением , когда объект Java является массивом примитивного типа данных. В этом случае срабатывает автоматическое преобразование между MATLAB и Java, обеспечение соответствия Java array-of-primitive-double непосредственно двойной матрице в MATLAB - что по соглашениям MATLAB является вещью, «переданной как значение», поэтому возвращаемые значения невозможны. Поэтому мой вопрос можно перефразировать так: есть ли способ обойти это?


(вы можете прекратить читать здесь.)

Для справки, мой частный случай был следующим:

У меня Java class 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[]);
}

Это видно изнутри MATLAB, как только я правильно установил javapath:

>> methods MyClass -full

Methods for class MyClass:

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

Я могу вызвать функцию SetFWD изнутри MATLAB, но я не могу заставить 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 Передача данных в метод Java и Работа с массивами Java , а также сообщения SO Переход от типов Java к типам MATLAB и Странные классы переданы из Matlab в java , я понимаю, что Matlab автоматически преобразует любой двойной массив, который я передаю функции, в массив Java, а затем игнорирует любые изменения, вносимые в эти массивы. Кажется, что если бы мое определение функции в MyClass содержало объекты Double вместо примитивов double, моя вторая попытка могла бы сработать.

Есть ли способ заставить MATLAB вернуть значение, которое я ищу, без изменения исходного .DLL (mydll.dll)?

Обновление

Я понимаю, что MATLAB обычно передает все "по значению". Но в Передача данных в метод Java Mathworks говорит, что

Если вам нужно получить доступ к изменениям, Тогда метод Java преобразует массив, вместо передачи массива MATLAB, вы должны создать и передать Java Я хочу, чтобы люди могли регистрироваться только в том случае, если они используют один из двух конкретных доменов в своем адресе электронной почты.

Так, например, они могут зарегистрироваться, если они используют @ domain1.co.uk или @ domain2.co.uk, но никакие другие домены (например, Gmail, Yahoo и т. д.) использовать нельзя.

Было бы здорово, если бы кто-нибудь указал мне правильное направление.

5
задан tugberk 5 April 2011 в 23:30
поделиться