【问题标题】:How to convert Java code into Matlab如何将Java代码转换为Matlab
【发布时间】:2017-06-23 09:48:17
【问题描述】:

我有一个 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 中有什么函数可以用来比较两个不同长度的向量吗?

【问题讨论】:

    标签: java matlab vector


    【解决方案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() 方法。

    【讨论】:

      【解决方案2】:

      这很容易在 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 代码中的第二个循环。

      Tom 使用arrayfun 的回答基本上让Matlab 为你做另一个循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-30
        • 2016-05-17
        • 2011-03-27
        • 2017-08-13
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多