我想在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));
}
}
答案 0 :(得分:3)
以下是计算top-triange值的示例代码。没有角落情况检查如i,j >= 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]);
}
答案 1 :(得分:3)
如果您是按列存储矩阵,则有一个简单的公式,用于测试i,j'th矩阵元素的索引。
在你的例子中你会有
double[] test = {1,2,4,3,5,6};
如果Col(i)是列i的开头的索引 那么
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的开头进一步存储, 即在Col(j)+ i,所以你应该添加
return test[ ((j-1)*(j-2))/2 + i];
代码
如果必须按行而不是列存储,则有一个类似的公式。这有点麻烦。我们的想法是首先弄清楚,从最后一个非零行开始,行的末尾将被解决。