matlab与java的转换
我是java编程新手。我需要将我的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代码
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。这非常有帮助。