Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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,我有一个2D矩阵。我的问题要求我在逻辑上将其划分为4个子矩阵。e、 如果我的原始矩阵是4*4,那么有4个子矩阵是2*2。 一个从(0,0)开始,另一个是原始矩阵的(0,2)、(2,0)和(2,2)索引。 我在程序中多次访问和设置值。我想通过类似矩阵[x][y]的方式访问子矩阵元素。at(row,col),其中x,y指定子矩阵编号,row,col表示在(row,col)处使用该子矩阵的元素。 例如 矩阵[2][2]。在[0][0]-->处应给出第四个子矩阵中的第一个元素 非常感谢您的帮助 提前感谢

我有一个2D矩阵。我的问题要求我在逻辑上将其划分为4个子矩阵。e、 如果我的原始矩阵是4*4,那么有4个子矩阵是2*2。 一个从(0,0)开始,另一个是原始矩阵的(0,2)、(2,0)和(2,2)索引。 我在程序中多次访问和设置值。我想通过类似矩阵[x][y]的方式访问子矩阵元素。at(row,col),其中x,y指定子矩阵编号,row,col表示在(row,col)处使用该子矩阵的元素。 例如 矩阵[2][2]。在[0][0]-->处应给出第四个子矩阵中的第一个元素

非常感谢您的帮助


提前感谢

您希望查看空间填充曲线。sfc将2d复杂度降低为1d复杂度。它可以帮助理解四叉树,也可以像四叉树一样使用。你想看看尼克的希尔伯特曲线四叉树空间索引博客。

你想看看空间填充曲线。sfc将2d复杂度降低为1d复杂度。它可以帮助理解四叉树,也可以像四叉树一样使用。你想看看尼克的希尔伯特曲线四叉树空间索引博客。

我不确定这里有什么问题。基本上,您只需要一个伪语义api来寻址二维矩阵的元素。注意(假定为随机)对数组的读写。我们假设您没有处理线程问题

类型为Foo,Foo[][]的二维数组当然可以工作。你只需要把它包起来

public class Matrix<T> {
    public interface Quadrant<T> {
        T get(int i, int j);
        void set(T v, int i, int j);
    }
    public static final int XDIM = 4;
    public static final int YDIM = 4;
    private final Object[][] matrix = new Object[XDIM][YDIM];
    public Matrix() { /* .. */ }
    public Quadrant<T> quadrant(final int x, final int y) {
        return new Quadrant<T> () {
            @SuppressWarnings("unchecked")
            @Override public final T get(int i, int j) {
                return (T) matrix [x+i][y+j]; // todo: range checks, etc.
            }
            @Override public final void set(T v, int i, int j) {
                matrix [x+i][y+j] = v; // todo: range checks, etc.
            }
        };
    }
    public static void main(String[] args) {
        Matrix<Object> m = new Matrix<Object>();
        m.quadrant(2, 2).set("hi there!", 0, 1);
        System.out.format("{%d, %d}:(%d, %d) => %s\n", 2, 2, 0, 1, m.quadrant(2, 2).get(0, 1));
    }
}
公共类矩阵{
公共界面象限{
T-get(inti,intj);
无效集(tv,inti,intj);
}
公共静态最终int XDIM=4;
公共静态最终整数YDIM=4;
私有最终对象[][]矩阵=新对象[XDIM][YDIM];
公共矩阵(){/*..*/}
公共象限(最终整数x,最终整数y){
返回新象限(){
@抑制警告(“未选中”)
@覆盖公共最终T get(int i,int j){
返回(T)矩阵[x+i][y+j];//todo:范围检查等。
}
@覆盖公共最终无效集(tV、int i、int j){
矩阵[x+i][y+j]=v;//todo:范围检查等。
}
};
}
公共静态void main(字符串[]args){
矩阵m=新矩阵();
m、 象限(2,2)。设置(“你好!”,0,1);
System.out.format(“{%d,%d}:(%d,%d)=>%s\n”,2,2,0,1,m.quadrant(2,2).get(0,1));
}
}

我不确定这里有什么问题。基本上,您只需要一个伪语义api来寻址二维矩阵的元素。注意(假定为随机)对数组的读写。我们假设您没有处理线程问题

类型为Foo,Foo[][]的二维数组当然可以工作。你只需要把它包起来

public class Matrix<T> {
    public interface Quadrant<T> {
        T get(int i, int j);
        void set(T v, int i, int j);
    }
    public static final int XDIM = 4;
    public static final int YDIM = 4;
    private final Object[][] matrix = new Object[XDIM][YDIM];
    public Matrix() { /* .. */ }
    public Quadrant<T> quadrant(final int x, final int y) {
        return new Quadrant<T> () {
            @SuppressWarnings("unchecked")
            @Override public final T get(int i, int j) {
                return (T) matrix [x+i][y+j]; // todo: range checks, etc.
            }
            @Override public final void set(T v, int i, int j) {
                matrix [x+i][y+j] = v; // todo: range checks, etc.
            }
        };
    }
    public static void main(String[] args) {
        Matrix<Object> m = new Matrix<Object>();
        m.quadrant(2, 2).set("hi there!", 0, 1);
        System.out.format("{%d, %d}:(%d, %d) => %s\n", 2, 2, 0, 1, m.quadrant(2, 2).get(0, 1));
    }
}
公共类矩阵{
公共界面象限{
T-get(inti,intj);
无效集(tv,inti,intj);
}
公共静态最终int XDIM=4;
公共静态最终整数YDIM=4;
私有最终对象[][]矩阵=新对象[XDIM][YDIM];
公共矩阵(){/*..*/}
公共象限(最终整数x,最终整数y){
返回新象限(){
@抑制警告(“未选中”)
@覆盖公共最终T get(int i,int j){
返回(T)矩阵[x+i][y+j];//todo:范围检查等。
}
@覆盖公共最终无效集(tV、int i、int j){
矩阵[x+i][y+j]=v;//todo:范围检查等。
}
};
}
公共静态void main(字符串[]args){
矩阵m=新矩阵();
m、 象限(2,2)。设置(“你好!”,0,1);
System.out.format(“{%d,%d}:(%d,%d)=>%s\n”,2,2,0,1,m.quadrant(2,2).get(0,1));
}
}

i认为可能会有一些更简单的方法?也许吧,但从2d到1d的复杂度降低是值得寻找的,并将极大地帮助您解决问题!但是,如果你能告诉我四叉树是否能帮助你解决问题,你可以很快解决你的问题?实际上,我需要它来进行矩阵乘法,所以我担心四叉树在这里会很有用,虽然会有更简单的方法?也许吧,但是从2d复杂度降低到1d复杂度是值得寻找的,并且会对你的问题有很大帮助!但是,如果你能告诉我四叉树是否能帮助你解决问题,你可以很快解决你的问题。实际上,我需要它进行矩阵乘法,所以我担心四叉树在这里会很有用。谢谢,这解决了我的大部分问题。我想再做一次改变。因为象限也是矩阵,所以当我们调用m.Quadrant(2,2)时,有没有方法返回类型矩阵而不是象限。你可以任意剪切和切片它。例如,将矩阵作为一个接口,然后从矩阵扩展象限。谢谢,这解决了我的大部分目的。我想再做一次改变。因为象限也是矩阵,所以当我们调用m.Quadrant(2,2)时,有没有方法返回类型矩阵而不是象限。你可以任意剪切和切片它。例如,使矩阵成为一个接口,然后从矩阵扩展象限。