matlab:查找java对象数组的长度

时间:2010-06-25 13:09:23

标签: java matlab

我有一个带有Foo方法的java对象(我们称之为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 个答案:

答案 0 :(得分:3)

您可以使用单元格数组而不是常规数组 - 这将起作用:

>> 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 :(得分:3)

您可以使用builtin()强制Matlab使用自己的length(),numel()或任何函数,忽略Java类的同名方法。调用isscalar()或numel()大部分时间都可以工作,因为Java类倾向于不使用这些名称定义方法。但如果他们这样做,你将获得Java方法并遇到与length()相同的问题。无论Java类有什么方法,使用builtin()都会更通用。

>> 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

答案 2 :(得分:1)

您是否尝试过使用NUMEL功能代替功能LENGTH?这应该给你相同的结果(即数组中元素的数量),但避免重载length方法的问题。

答案 3 :(得分:0)

嗯,这似乎有效......

function printLength(someArray)
if (isscalar(someArray))
    L = 1;
else
    L = length(someArray);
end
disp(L);