我有一个带有 length()
方法的 java 对象(我们称它为 Foo
)。
在 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
有办法解决这个问题吗?
最佳答案
您可以使用 builtin() 强制 Matlab 使用它自己的 length()、numel() 或任何函数,而忽略 Java 类的同名方法。大多数时候调用 isscalar() 或 numel() 都可以,因为 Java 类往往不使用这些名称定义方法。但如果他们这样做,您将获得 Java 方法并遇到与 length() 相同的问题。使用 builtin() 会更通用,无论 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
关于java - matlab:查找java对象数组的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118210/