Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建用户定义的多维向量_Java_Multidimensional Array - Fatal编程技术网

Java 如何创建用户定义的多维向量

Java 如何创建用户定义的多维向量,java,multidimensional-array,Java,Multidimensional Array,我试着为我的矩阵理论课程创建一个程序,让你输入你自己的矩阵并做一个定标器乘法,我的问题是如何让用户选择向量的维数我的第一个想法是创建一个带有一系列选项的switch case语句,但它不是很动态的 switch (dimensions) { case 1: Vector[] matrix1 = new Vector[2]; break; case 2: Vector[][] matrix2 = new Ve

我试着为我的矩阵理论课程创建一个程序,让你输入你自己的矩阵并做一个定标器乘法,我的问题是如何让用户选择向量的维数我的第一个想法是创建一个带有一系列选项的switch case语句,但它不是很动态的

switch (dimensions) {
      case 1:
          Vector[] matrix1 = new Vector[2];
            break;
      case 2: 
          Vector[][] matrix2 = new Vector[2][2];
            break;
      case 3:
          Vector[][][] matrix3 = new Vector[2][2][2];
      default:

            break;
    }

我不想为自己编写任何代码,我只是不确定这是否是正确的方向,也不感谢您的帮助

创建它们并不是唯一的问题,
(您可以使用反射来完成 ) 但是后来你需要使用它们,而且不知道它们的类型,这很痛苦

矩阵是二维结构,因此不需要三维。
一维(向量)也可以看作是一个单行矩阵。

所以您只需要向量[]。

创建它们不是唯一的问题,
(您可以使用反射来完成 ) 但是后来你需要使用它们,而且不知道它们的类型,这很痛苦

矩阵是二维结构,因此不需要三维。
一维(向量)也可以看作是一个单行矩阵。

所以你只需要向量[]。

也许这个问题的答案很有用:

基本上,您可以使用以下方法创建“多维”数组:

java.lang.reflect.Array.newInstance(Class<?> componentType, int... dimensions)
java.lang.reflect.Array.newInstance(类componentType,int…维度)
例如:

int numberOfDimensions = 3;
int[] dims = new int[numberOfDimensions];
for (int i = 0; i < dims.length; i++) {
    dims[i] = 2;
}

Object multiDimensionalArray = Array.newInstance(Vector.class, dims);
int numberOfDimensions=3;
int[]dims=新的int[numberOfDimensions];
对于(int i=0;i
然后使用更多的反射和递归将其填充为值


最后,最好将用户限制在固定数量的维度上,并坚持使用
开关
块。

也许这个问题的答案会有用:

基本上,您可以使用以下方法创建“多维”数组:

java.lang.reflect.Array.newInstance(Class<?> componentType, int... dimensions)
java.lang.reflect.Array.newInstance(类componentType,int…维度)
例如:

int numberOfDimensions = 3;
int[] dims = new int[numberOfDimensions];
for (int i = 0; i < dims.length; i++) {
    dims[i] = 2;
}

Object multiDimensionalArray = Array.newInstance(Vector.class, dims);
int numberOfDimensions=3;
int[]dims=新的int[numberOfDimensions];
对于(int i=0;i
然后使用更多的反射和递归将其填充为值


最后,最好将用户限制在固定数量的维度上,并坚持使用
开关
块。

一种方法是定义自己的类来表示具有可变维度的数组。不过,实现这个类并不是件小事

我会利用Java的“变量arity”方法:

这让打电话的人可以做如下事情

DynamicDimensionArray vector = new DynamicDimensionArray(10);  // one-dimensional
DynamicDimensionArray matrix = new DynamicDimensionArray(3, 5); // two-dimensional
DynamicDimensionArray fiveDim = new DynamicDimensionArray(2, 3, 2, 10, 4);
     // five-dimensional
在构造函数中,
dimension
实际上被视为
int[]
。因此
dimension.length
提供了维度的数量

那么,您将如何实现该类呢?我认为最简单的方法(其实没有那么简单)是使用私有变量,它是您类型的一维数组(假设它是一个
双精度
)。元素数量是通过将
维度中的元素相乘得到的:

    private double[] data;

    public DynamicDimensionArray(int... dimension) {
        int totalElements = 1;
        for (int dim : dimension) {
             totalElements *= dim;
        }
        data = new double[totalElements];
    }
然后,实现类的其余部分取决于您希望支持的操作。您可能需要一个
getElement
方法来获取数组的一个元素:

public double getElement(int... index) {
    // ???
}
与前面一样,
index
将是方法内部的
int[]
。您需要检查以确保长度与原始
维度的长度匹配,如果不匹配,则抛出异常。诀窍是将索引转换为可以在一维
数据中使用的索引。基本公式(假设所有索引都是0相对的)如下所示:

如果它是一个维度为d0的一维数组,并且索引为i0,则
data
中的索引仅为i0

如果它是一个具有维度(d1,d0)的二维数组,并且索引为(i1,i0),则
数据的索引为i1d0+i0

如果它是一个具有维度(d2、d1、d0)的三维数组,并且索引是(i2、i1、i0),则
数据的索引是i2d1d0+i1d0+i0

等等。。。你应该能看到图案

有关更多信息,请查阅维基百科中的“行主顺序”


不过,这不是小事;因此,如果你只限于一小部分维度,比如3,那么你应该考虑提姆的评论,使用<代码>开关可能是可以的。p> 一种方法是定义自己的类来表示具有可变维度的数组。不过,实现这个类并不是件小事

我会利用Java的“变量arity”方法:

这让打电话的人可以做如下事情

DynamicDimensionArray vector = new DynamicDimensionArray(10);  // one-dimensional
DynamicDimensionArray matrix = new DynamicDimensionArray(3, 5); // two-dimensional
DynamicDimensionArray fiveDim = new DynamicDimensionArray(2, 3, 2, 10, 4);
     // five-dimensional
在构造函数中,
dimension
实际上被视为
int[]
。因此
dimension.length
提供了维度的数量

那么,您将如何实现该类呢?我认为最简单的方法(其实没有那么简单)是使用私有变量,它是您类型的一维数组(假设它是一个
双精度
)。元素数量是通过将
维度中的元素相乘得到的:

    private double[] data;

    public DynamicDimensionArray(int... dimension) {
        int totalElements = 1;
        for (int dim : dimension) {
             totalElements *= dim;
        }
        data = new double[totalElements];
    }
然后,实现类的其余部分取决于您希望支持的操作。您可能需要一个
getElement
方法来获取数组的一个元素:

public double getElement(int... index) {
    // ???
}
与前面一样,
index
将是方法内部的
int[]
。您需要检查以确保长度与原始
维度的长度匹配,如果不匹配,则抛出异常。诀窍是将索引转换为可以在一维
数据中使用的索引。基本公式(假设所有索引都是0相对的)如下所示:

如果它是一个维度为d0的一维数组,并且索引为i0,则
data
中的索引仅为i0