2010-06-25 42 views
3

我有一個java對象(我們稱之爲Foo)與length()方法。matlab:找到一個java對象數組的長度

在MATLAB中,我想編寫一個接受這些對象數組並使用它的函數。我的問題是編寫循環的常用方法分解:

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

,因爲在這種情況下MATLAB決定「哦,這是一個Java對象; length(x)應該被解釋爲x.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 

有沒有辦法來解決這個問題?

+0

我會好奇的知道重載的'length'是否被調用了所有三次,或者只是第三次。你可以嘗試使用[WHICH](http://www.mathworks.com/access/helpdesk/help/techdoc/ref/which.html)來找出正在調用哪個版本的函數,比如'which printLength([ foo])','printLength([foo foo])'等。 – gnovice 2010-06-25 17:23:09

+0

這絕對只是第三次。另一次你有一個多於一個對象的數組,並且MATLAB足夠聰明地知道,哦,它是一個數組,我需要找出它的大小。 – 2010-06-25 17:46:11

回答

3

您可以使用內置的()給力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 
0

嗯,這似乎工作....

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

您是否試過使用函數NUMEL而不是函數LENGTH?這應該給你相同的結果(即數組中元素的數量),但避免過載方法的問題。

+0

還是'size'函數? – yuk 2010-06-25 15:59:37

+1

兩者均爲真。我想知道是否有任何保留的方法,或者如果存在有關名稱的方法,MATLAB是否總是調度到Java對象。 – 2010-06-25 16:46:04

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)