[英]matlab: finding length of an array of java objects
我有一個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
有辦法解決這個問題嗎?
您可以使用單元格數組而不是常規數組 - 這將起作用:
>> 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)
您可以使用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
嗯,這似乎工作....
function printLength(someArray)
if (isscalar(someArray))
L = 1;
else
L = length(someArray);
end
disp(L);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.