Math 计算矩阵中交叉对角元素的和
我想把矩阵中的交叉对角线元素加在一起。例如,我有一个二维的3*3矩阵,我想把它转换成一维:Math 计算矩阵中交叉对角元素的和,math,for-loop,matrix,Math,For Loop,Matrix,我想把矩阵中的交叉对角线元素加在一起。例如,我有一个二维的3*3矩阵,我想把它转换成一维: ------------------- | 1 | 2 | 3 | ------------------- A= | 4 | 5 | 6 | ------------------- | 7 | 8 | 9 | ------------------- 最终输出为: ____ ____
-------------------
| 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
等等…需要考虑的一些想法: 从nxn矩阵A的对角线生成的数组B的长度是多少?让我们把这个长度称为L。 为了强调这一点,L和A有什么关系?这与外环直接相关。 B中每个元素的加数位置是如何相互关联的?i、 它们是对角的,但是你怎么用数学来表达呢? 如果你能用数学的方法来表达,你会如何在它们之间迭代以求和?这将帮助您处理内部循环。
需要考虑的一些想法: 从nxn矩阵A的对角线生成的数组B的长度是多少?让我们把这个长度称为L。 为了强调这一点,L和A有什么关系?这与外环直接相关。 B中每个元素的加数位置是如何相互关联的?i、 它们是对角的,但是你怎么用数学来表达呢? 如果你能用数学的方法来表达,你会如何在它们之间迭代以求和?这将帮助您处理内部循环。
请注意,对于每个对角线,行索引和列索引之和等于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
}
}
请注意,对于每个对角线,行索引和列索引之和等于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致@Krunal的伟大问题和@POPOL的回答,非常希望看到它将如何工作,因此创建了以下“正在进行的工作”: 我将看看循环中需要什么,以便消除标记超出范围的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>
+1致@Krunal的伟大问题和@POPOL的回答,非常希望看到它将如何工作,因此创建了以下“正在进行的工作”: 我将看看循环中需要什么,以便消除标记超出范围的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>
这里有一个不用于循环的两行解决方案:
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] 1614149
laply功能是plyr软件包的一部分。这里有一个不用于环路的双线解决方案:
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] 1614149
laply函数是plyr包的一部分。aw,这完全是“家庭作业问题”-你给出的答案太容易了。我认为在外环中,条件应该是@Kache啊哦。。。也许我应该隐藏一些代码行…@Krunal它取决于索引是从0开始还是从1开始,试试看!哦,伙计,这完全是“家庭作业问题”-你给出的答案太容易了我想在外环,条件应该是@Kache啊哦。。。也许我应该隐藏一些代码行…@Krunal它取决于索引是从0开始还是从1开始,试试看!