【问题标题】:how to create a user defined multidimensional vector如何创建用户定义的多维向量
【发布时间】:2015-11-21 07:33:48
【问题描述】:

我试图为我的矩阵理论课创建一个程序,让您输入自己的矩阵并进行缩放乘法,我的问题是如何让用户选择向量的维度我首先想到的是创建一个带有一堆选项的 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;
    }

我不是在寻找要为我编写的任何代码我只是不确定这是否是正确的方向或不感谢您的任何帮助

【问题讨论】:

  • 您期望任意维度还是有固定的最大维度数?对于仅 3 个可能的值,我认为您所拥有的值还可以。

标签: java multidimensional-array


【解决方案1】:

创建它们并不是唯一的问题,
(你可以使用反射来做到这一点 http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/array/newInstance.html) 但是后来你需要使用它们,并且不知道它们的类型,这很痛苦。

矩阵是二维结构,不需要3维。
也可以将一维(向量)视为单行矩阵。
所以你只需要 Vector[]。

【讨论】:

  • 你的权利,我看错了,谢谢!
【解决方案2】:

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

Is it possible to dynamically build a multi-dimensional array in Java?

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

java.lang.reflect.Array.newInstance(Class<?> componentType, int... dimensions)

例如:

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);

然后你使用更多的反射和递归来填充它。

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

【讨论】:

    【解决方案3】:

    一种方法是定义您自己的类来表示具有可变维度的数组。不过,实现该类并非易事。

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

    public class DynamicDimensionArray {
    
        public DynamicDimensionArray(int... dimension) {
            // code
        }
    

    这让调用者可以做类似的事情

    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 给了你维数。

    那么你将如何实现这个类?我认为最简单的方法(实际上并不是那么简单)是使用私有变量,它是您类型的一维数组(假设它是double)。元素个数通过dimension中的元素相乘得到:

        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[]。您将检查以确保长度与原始 dimension 的长度匹配,如果不匹配则抛出异常。诀窍是将索引转换为可以在一维data 中使用的索引。基本公式(假设所有索引都是相对于 0 的)如下所示:

    如果是维度为d0的一维数组,且索引为i0data 的索引只是 i0

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

    如果是3维数组,维度为(d2, d1, d0),索引为(i2,i1, i0),data 的索引是 i2d1d0 + i1d em>0 + i0.

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

    在 Wikipedia 中查找“行主要顺序”以获取更多信息。

    不过,这不是微不足道的;因此,如果您仅限于少数维度,例如 3,那么您应该考虑 Tim 的评论,即使用 switch 可能没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多