如何将Java代码转换为Matlab

时间:2017-06-23 09:48:18

标签: java matlab vector

我有一个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中是否有任何函数可用于比较两个不同长度的向量?

2 个答案:

答案 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为你做另一个循环。