2017-06-23 22 views
1

私はJavaコードを持っており、Matlabコードに変換したいと思います。自動的にそうする特別な方法はありますか?JavaコードをMatlabに変換するには

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ある

これは私が翻訳していたJavaコードがあります。それにはベクトルのインデックスが含まれており、ベクトルの各要素以上のベクトルv2の要素に対応しています。

私が自動的に行うことができない場合、異なる長さの2つのベクトルを比較するために使用できるMatlabの関数がありますか?

答えて

1

アルゴリズムの場合、arrayfun()というMATLAB固有の機能を使用して、配列の各値に対して関数を実行し、その結果を新しい配列として返すことができます。上記のコードのMatlabの同等である:出力は、一般的な、あなたすることはできません自動的変換で1 3 4 5 6 8

あるので、Matlabのインデックスは、(Javaのインデックスは0から始まり、1)から開始することを

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) 

注意2つの言語のコンポーネントが同等ではないため、JavaからMatlabへの変換はありません。たとえば、Java配列はMatlab行列と同じではないため、常に同じように動作するとは限りません。しかし、多くの場合、の具体的なの場合、これは問題ではなく、同等のコードを開発することができます。しかし、各言語には私が参照したarrayfun()メソッドのような、あなたを助けることができる独自の特殊機能があるので、行単位の変換は必ずしも最善の方法ではありません。

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コードの2番目のループは必要ありません。

トムの回答arrayfunを使用すると、基本的にMatlabはもう一方のループを行います。

関連する問題