我有一个带有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
有没有办法解决这个问题?
答案 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)
答案 3 :(得分:0)
function printLength(someArray)
if (isscalar(someArray))
L = 1;
else
L = length(someArray);
end
disp(L);