matlab与java的转换

matlab与java的转换,java,matlab,Java,Matlab,我是java编程新手。我需要将我的matlab代码转换为基本java代码,不像使用循环和数组那样复杂,我尝试了好几次,但都失败了。谢谢你的帮助。这是我的代码 x = [1,2,3,4,5,6,7]; x = perms(x); i = 0; c=1; for m=1:1:5040; for n=1:1:6; if(x(c,n) == (x(c,(n+1))-1)) i = i+1; break end end c=c+1; end Answer : 2119 让我们浏览一下Matlab代码

我是java编程新手。我需要将我的matlab代码转换为基本java代码,不像使用循环和数组那样复杂,我尝试了好几次,但都失败了。谢谢你的帮助。这是我的代码

x = [1,2,3,4,5,6,7];
x = perms(x);
i = 0;
c=1;
for m=1:1:5040;
for n=1:1:6;
if(x(c,n) == (x(c,(n+1))-1))
i = i+1;
break
end 
end
c=c+1;
end

Answer : 2119

让我们浏览一下Matlab代码,并将每一行翻译成Java。我们将需要一些抽象,我们将在移动中介绍它们

第一行:

x = [1,2,3,4,5,6,7]; 
将向量指定给变量x。我们可以简单地说向量是一个整数数组,但也许我们以后需要一些更好的抽象。让我们定义一个新的类向量。不要将其与java.util.Vector混淆:可能存在多个具有相同非限定名称的类

class Vector {
    private int[] value;

    Vector(int... value) {
        this.value = value;
    }

    int apply(int i) {
        return value[i - 1];
    }

    int length() {
        return value.length;
    }

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        String prefix = "";
        for (int entry : value) {
            result.append(prefix).append(entry);
            prefix = " ";
        }
        return result.toString();
    }
}
我们使用整数数组作为向量的内部表示。注意,您可以随时交换内部表示,只要它不泄漏到类的接口中。因此,我们将值成员的访问限制为private,这意味着只允许Vector类型的对象访问它

新的向量对象通过调用构造函数向量来实例化。。。值,该值接受vararg整数参数。在Java内部,varargs与数组相同,但它们为我们提供了语法上的支持,可以用以下方式实例化x:

Vector x = new Vector(1, 2, 3, 4, 5, 6, 7); 
这看起来很像你的Matlab代码

另一件事是,在Java中,数组是零索引的,而Matlab从1开始索引。我们的Vector类定义了一个apply方法,该方法应该访问第i个索引。因此,它返回值[i-1]

现在我们要计算

x = perms(x);
perms返回一个矩阵,包含向量x的所有置换。所以我们需要另一种抽象:矩阵

矩阵的定义非常类似于向量,但其内部表示是向量数组,即矩阵的行。同样,我们定义了一个方法apply来检索元素:这次,它使用两个参数,行索引和列索引

旁注:重写方法toString总是好的,它是在Java的类型层次结构的顶部元素:Object中定义的。您可以尝试实例化向量或矩阵,并将其作为参数传递给System.out.println,以查看字符串表示形式的外观

现在我们仍然需要在Java中实现perms。perms方法获取一个向量并返回一个矩阵。我有一个非常黑客和丑陋的实现,我有点不愿意展示,但为了完整的答案,这里是:

static Matrix perms(Vector vector) {
    int[] indices = new int[vector.length()];
    for (int i = 0; i < vector.length(); i++)
        indices[i] = i;
    List<int[]> allPermuationIndices = new ArrayList<int[]>();
    permutation(new int[0], indices, allPermuationIndices);
    Vector[] perms = new Vector[allPermuationIndices.size()];
    for (int i = 0; i < perms.length; i++) {
        int[] permutationIndices = allPermuationIndices.get(i);
        int[] vectorValue = new int[permutationIndices.length];
        for (int j = 0; j < permutationIndices.length; j++)
            vectorValue[j] = vector.apply(permutationIndices[j] + 1);
        perms[i] = new Vector(vectorValue);
    }
    return new Matrix(perms);
}

private static void permutation(int[] prefix, int[] remaining, List<int[]> returnValue) {
    if (remaining.length == 0)
        returnValue.add(prefix);
    else {
        for (int i = 0; i < remaining.length; i++) {
            int elem = remaining[i];
            int[] newPrefix = Arrays.copyOf(prefix, prefix.length + 1);
            newPrefix[prefix.length] = elem;
            int[] newRemaining = new int[remaining.length - 1];
            System.arraycopy(remaining, 0, newRemaining, 0, i);
            System.arraycopy(remaining, i + 1, newRemaining, i + 1 - 1, remaining.length - (i + 1));
            permutation(newPrefix, newRemaining, returnValue);
        }
    }
}
现在,for循环:

for m = 1:1:5040
    ...
end
转化为

int i = 0; 
int c = 1; 
for (int m = 1; m <= 5040; i++) {
    ...
}
if (x2.apply(c, n) == (x2.apply(c, n+1) - 1)) {
    ...
}
转化为

int i = 0; 
int c = 1; 
for (int m = 1; m <= 5040; i++) {
    ...
}
if (x2.apply(c, n) == (x2.apply(c, n+1) - 1)) {
    ...
}

其中apply是我们在矩阵上定义的方法。请注意,在Java中,==如果应用于非基本类型,即除int、byte、char、double、boolean和float之外的所有类型,将给出奇怪的结果。通常,您可以使用在对象上定义的方法equals来测试等价性

我试了好几次,但都失败了你试了什么?什么不起作用?你预计会发生什么?会发生什么?请张贴您的代码。您有MatlabBuilder JA吗?除非您手动将MATLAB代码翻译成Java,否则这就是您需要的。不,我没有MATLAB Builder JA,也无法将MATLAB代码翻译成Java,我是Java新手。您为什么要将MATLAB代码翻译成Java?这应该是Java编程中的一个练习,还是出于性能方面的原因,你通常想将Matlab翻译成Java?我正在上大学算法和复杂性课程。这是一个我需要转换成Java的问题。非常感谢@Kulu Limpa。这非常有帮助。