【问题标题】:Triangular matrix get() in one dimensional array一维数组中的三角矩阵 get()
【发布时间】:2018-02-16 03:45:02
【问题描述】:

我想将一个三角矩阵保存在一个 1 dim 数组中(以最小化所需的空间,所有零都被省略)并创建一个函数 get() 以从原始矩阵中查找特定条目。

例如:

让我们看看下面的三角矩阵:

0 1 2 3 
0 0 4 5 
0 0 0 6 
0 0 0 0

我正在像这样保存这个矩阵:

double[] test = {1,2,3,4,5,6};

所以所有的零都被忽略了。

我想写一个函数,给我一个原始矩阵的值:

get(3,4)

应该给我6

我正在检查输入以查看它是否超出范围以及它是否在对角线下方或对角线上。

//Checking if input is valid 
        if (i <= n &&  j <= n && i >= 1 && j >= 1){
            if( j <= i ){
                return 0.0;
            }else {

            }
        }

这行得通。

我该如何继续?我无法在我的数组中找到等效的矩阵条目。

任何帮助将不胜感激。

编辑:

我的整个代码:

public class dreiecksmatrix {
    int n = 4;
    double[] a = {1,2,3,4,5,6};

    public double get( int i, int j){

        //Checking if input is valid 
        if (i <= n &&  j <= n && i >= 0 && j >= 0){
            if( j <= i ){
                return 0.0;
            }else {

            }
        }

        return 1.0;
    }

    public static void main(String [] args ){
        dreiecksmatrix test = new dreiecksmatrix();
        System.out.println(test.get(2,3));

    }
}

【问题讨论】:

  • 没有得到(3,4)给你 6?
  • @dbahdano 对,我的错。
  • @ViktorG 你能详细说明一下吗? test.get(3,4) 如何给你 6?
  • @dbahdano test.get(3,4) 表示第 3 行第 4 列元素,在这种情况下为 6
  • @sandy 我明白了,但在这种情况下,.get() 不应该来自 test 这是一个数组。 Java Array 没有get(int,int) 方法。

标签: java arrays matrix


【解决方案1】:

这里是计算top-tringe值的示例代码。目前还没有像i,j &gt;= 1 这样的极端情况检查,但添加它们很容易。

arr = [[0, 1, 2, 3, 4],
       [0, 0, 5, 6, 7],
       [0, 0, 0, 8, 9],
       [0, 0, 0, 0, 10],
       [0, 0, 0, 0, 0]];

flatArr = [1,2,3,4,5,6,7,8,9,10];

n = 5; // matrix size
i = 1; 
j = 3;

if (j <= i) {

    alert(0);

} else {
    pos = 0;
    // find an offset caused by first (i - 1) lines
    for (k = 1; k < i; k++) {
       pos += n - k;
    }

    // find an offset in line x
    pos += j - i;

    // array index start from 0 so decrement value
    pos = pos - 1;

    alert('flatArr[' + pos + '] = ' + flatArr[pos]);
}

【讨论】:

    【解决方案2】:

    如果您改为按列存储矩阵,则有一个简单的公式可用于测试第 i,j 个矩阵元素的索引。

    在您的示例中,您将拥有

    double[] test = {1,2,4,3,5,6};
    

    如果 Col(i) 是第 i 列开头的索引 pf 那么

      Col(2) = 0
      Col(3) = Col(2) + 1
    ..
      Col(n) = Col(n-1) + n-1
    

    因此

    Col(j) = ((j-1)*(j-2))/2

    第 i,j 个矩阵元素存储在第 j 列开始的第 i 个位置, 即在 Col(j)+i 处,所以你应该添加

      return test[ ((j-1)*(j-2))/2 + i];
    

    到你的代码

    如果您必须按行而不是按列存储,则有一个类似的公式。这有点混乱。这个想法是首先弄清楚,从最后一个非零行开始,解决行的末端。

    【讨论】:

      猜你喜欢
      • 2018-12-28
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2018-12-13
      • 2022-10-25
      • 1970-01-01
      • 2020-02-19
      • 2011-06-16
      相关资源
      最近更新 更多