2017-06-23 134 views
1

我有一個Java代碼,我想轉換成Matlab代碼。有沒有特別的方法可以自動執行?如何將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的索引,對應於大於或等於矢量v1的每個元素的矢量v2的元素。

如果我不能自動做到這一點,是否有Matlab中的任何函數可以用來比較兩個長度不同的向量?

回答

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矩陣不同,所以它們的行爲並不總是相同。但在許多具體情況下,這並不重要,你可以開發等價的代碼。但是,逐行轉換並不總是最好的做法,因爲每種語言都有自己的特殊功能可以幫助您,例如我引用的arrayfun()方法。

0

這很容易在Matlab中使用一點for循環和find。在相同的結構,你的代碼:

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爲你做其他循環。