簡體   English   中英

matlab:查找java對象數組的長度

[英]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

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

嗯,這似乎工作....

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM