matlab: поиск длины массива Java-объектов - PullRequest
3 голосов
/ 25 июня 2010

У меня есть Java-объект (назовем его Foo) с методом length().

В MATLAB я хочу написать функцию, которая принимает массив этих объектов и работает с ним.Моя проблема заключается в том, что обычный метод написания цикла ломается:

function doSomething(someArray)
    for i = 1:length(someArray)
        % do stuff with someArray(i)
    end

, потому что в этом случае MATLAB решает "о, это объект Java; length(x) следует интерпретировать как x.length(), так как он имеетМетод length ():

function printLength(someArray)
disp(length(someArray));

    ...

> foo = %%% get my handle to the Java Foo object %%%
> printLength([foo foo foo])
3
> printLength([foo foo])
2
> printLength([foo])
300000
% foo.length() gets called and returns 300000 or whatever

Есть ли способ обойти это?

Ответы [ 4 ]

3 голосов
/ 29 июня 2010

Вы можете использовать встроенный (), чтобы заставить Matlab использовать свои собственные функции length (), Numberl () или любые другие, игнорируя метод класса Java с тем же именем.Вызов isscalar () или numbersl () будет работать большую часть времени, потому что Java-классы не склонны определять методы с этими именами.Но если они это сделают, вы получите метод Java и столкнетесь с той же проблемой, что и с length ().Использование встроенной функции () будет более общим и работает независимо от того, какие методы используются в классах Java.

>> foo = java.lang.String('foo');
>> builtin('length', [foo foo])
ans =
     2
>> builtin('length', [foo])
ans =
     1
>> length([foo])
ans =
     3
>> 

Вы можете обернуть его так:

function out = mlength(x)
%MLENGTH Array length, ignoring Java length() methods

% Test for isjava to avoid ignoring overriden length() methods in Matlab objects
if isjava(x)
   out = builtin('length', x);
else
   out = length(x);
end
3 голосов
/ 27 июня 2010

Вы можете использовать массив ячеек вместо обычного массива - это будет работать:

>> jPanel = javax.swing.JPanel;
>> length({jPanel,jPanel,jPanel})
ans = 
    3
>> length({jPanel,jPanel})
ans = 
    2
>> length({jPanel})
ans = 
    1
>> length({})
ans = 
    0

И в вашем цикле просто получите доступ к someArray{i} вместо someArray(i)

1 голос
/ 25 июня 2010

Вы пытались использовать функцию NUMEL вместо функции LENGTH ? Это должно дать вам те же результаты (то есть количество элементов в массиве), но избежать проблемы с перегруженным методом length.

0 голосов
/ 25 июня 2010

хм, это похоже на работу ....

function printLength(someArray)
if (isscalar(someArray))
    L = 1;
else
    L = length(someArray);
end
disp(L);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...