我试图为我的矩阵理论类创建一个程序,让你输入你自己的矩阵并做一个标量乘法,我的问题是你如何让用户选择向量的维度我的第一个想法是创建一个带有一堆选项的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;
}
我不寻找任何代码为我写,我只是不确定这是否是正确的方向或不感谢您的任何帮助
创建它们并不是唯一的问题,
(你可以用反射来做http://da2i.univ-lille1.fr/doc/tutorial-java/reflect/array/newInstance.html)但稍后你需要使用它们,而不知道它们的类型,这是痛苦的。
矩阵是二维结构,因此不需要三维。
一维(向量)也可以看作是单行矩阵。
所以你只需要Vector[].
也许这个问题的答案是有用的:
是可能的动态构建一个多维数组在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
块。
一种方法是定义自己的类来表示具有可变维度的数组。不过,实现这个类并不简单。
我会利用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的一维数组,索引为i0,则data
的索引为i0。
如果是一个二维数组维度( d <子>子>, d <子> 0 子>),和索引(我<子>子>,我<子> 0 子>),索引到data
是我<子> 1 子> d <子> 0 子> + 我<子> 0 子>。
如果它是一个三维数组维度( d <子> 2 子>, d <子>子>, d <子> 0 子>),和索引(我<子> 2 子>,我<子>子>,我<子> 0 子>),索引到data
是我<子> 2 子> d <子> 1 子> d <子> 0 子> + 我<子> 1 子> d <子> 0 子> + 我<子> 0 子>。
等等……您应该能够看到模式。
在维基百科中查找"row-major order"获取更多信息。
这不是微不足道的;因此,如果您仅限于少量维度,例如3,那么您应该考虑Tim的评论,即使用switch
可能是可以的。