我有一个Java代码,我想翻译成Matlab代码。有没有具体的方法可以自动完成?
这是我必须翻译的Java代码:
public static void main(String[] args) {
double[] v1={1, 1.5, 2, 2.3, 3, 3.4};
double[] v2={1.2, 1.3, 1.5, 2, 2.4, 3.1, 3.3, 3.5, 3.9, 4, 5.1, 5.6};
int[] v;
v = calcolate(v1,v2);
int i;
for(i=0; i<v.length; i++)
System.out.println(v[i]);
}
private static int[] calcolate(double[] v1, double[] v2){
int i, j;
int[] v = new int[v1.length];
for(i=0; i<v1.length; i++){
boolean found = false;
for(j=0; j<v2.length; j++){
if(v1[i]<=v2[j] && !found){
v[i] = j;
found = true;
}
}
}
return v;
}
代码的输出是:
0
2
3
4
5
7
这是向量v
。它包含向量v2
的索引,对应于向量v2
的元素,它们大于或等于向量v1
的每个元素。
如果我不能自动完成,Matlab中是否有任何函数可用于比较两个不同长度的向量?
答案 0 :(得分:1)
对于您的算法,您可以使用名为arrayfun()
的特定于Matlab的功能,该功能对数组的每个值执行一个函数,并将结果作为新数组返回。上面代码的Matlab等价物是:
v1=[1, 1.5, 2, 2.3, 3, 3.4];
v2=[1.2, 1.3, 1.5, 2, 2.4, 3.1, 3.3, 3.5, 3.9, 4, 5.1, 5.6];
arrayfun(@(x) find(x <= v2, 1), v1)
请注意,Matlab索引从1开始(Java索引从零开始),因此输出为1 3 4 5 6 8
一般情况下,您无法自动从Java转换为Matlab,因为这两种语言的组件并不相同 - 例如,Java数组与Matlab矩阵不同,因此它们不会#39; t总是表现得一样。但在许多特定的情况下,这并不重要,您可以开发相同的代码。但是,逐行转换并不总是最好的事情,因为每种语言都有自己的特殊功能可以帮助您,例如我引用的arrayfun()
方法。
答案 1 :(得分:0)
使用一点for
循环和find
在Matlab中这很简单。与您的代码结构相同:
function main()
v1 = [1, 1.5, 2, 2.3, 3, 3.4];
v2 = [1.2, 1.3, 1.5, 2, 2.4, 3.1, 3.3, 3.5, 3.9, 4, 5.1, 5.6];
v = calcolate(v1, v2);
disp(v);
end
function v = calcolate(v1, v2)
v = zeros(size(v1));
for ii = 1:numel(v1)
% Find first element (hence the 1) where v2 >= each element of v1
v(ii) = find(v2 >= v1(ii), 1);
end
end
如果您想要列向量而不是行向量,请使用分号代替逗号,或使用撇号转置disp(v')
之类的向量。
Matlab的逻辑索引与find
函数结合使用意味着您不需要Java代码中的第二个循环。
汤姆使用arrayfun
的答案基本上让Matlab为你做另一个循环。