我想将矩阵中的交叉对角元素加在一起。例如,我有一个3 * 3矩阵是二维的,我想将其转换为一维:
-------------------
| 1 | 2 | 3 |
-------------------
A= | 4 | 5 | 6 |
-------------------
| 7 | 8 | 9 |
-------------------
最终输出将是,
____ ____ ____ ____ ____
B= |1 | 6 | 15 | 14 | 9 |
|____|____|____|____|____|
第一个交叉对角A[0][0]
将被复制到B[0]
。
然后将添加下一个跨对角元素A[1][0]
和A[0][1]
并将其复制到B[1]
,即将添加4和2。
然后将添加下一个交叉对角元素A[2][0]
和A[1][1]
以及A[0][2]
并将其复制到B[2]
,即 7,5将添加3个。
等等......
答案 0 :(得分:3)
请注意,对于每个对角线,row-index和column-index的总和等于B数组的索引。基于这个事实,你可以制作这样的算法:
// assuming the width and length of the Matrix is N
// it's good you have some ideas of the range of idea, try figure it out by yourself?
// definitely it should be a function of N
for (int i=0;i<F(N);i++) {
for (int j=0;j<=i;j++) { // consider why j should be in range (0,i) ?
// some cumulatively add here
}
}
答案 1 :(得分:1)
+1给@Krunal这个好问题和@POPOL答案,很想知道它是如何工作的,所以创建了以下'正在进行的工作':fiddle here。
我将查看循环中所需的内容,以便我可以消除标记超出范围的try例程。
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var a = [ [1,2,3],
[4,5,6],
[7,8,9],
[10,11,12],
[13,14,15]
];
var b = [],N = 4;
var item;
for (i=0;i<2*N-1;i++) {
b[i] = 0;
for (j=0;j<=i;j++) {
try {
item = (a[j][i-j] !== undefined)?a[j][i-j]:0;
}catch(e) {
console.log("out of range");
item =0;
}
b[i] +=item;
}
}
</script>
</head>
<body>
<div id="output"></div>
<script type="text/javascript">
for (w=0;w<b.length-1;w++) {
document.getElementById("output").innerHTML+=b[w] +",";
}
document.getElementById("output").innerHTML+=b[b.length-1] ;
</script>
</body>
</html>
答案 2 :(得分:0)
要考虑的一些想法:
答案 3 :(得分:0)
这是一个不用于循环的双线解决方案:
x=rbind(matrix(0, nc=ncol(A), nr=ncol(A)-1), A, matrix(0, nc=ncol(A), nr=ncol(A)-1))
laply(seq(sum(dim(A))-1), function(l) sum(diag(t(x[, ncol(A):1])[, l:nrow(x)])))
[1] 1 6 15 14 9
laply()
函数是plyr包的一部分。