按距单元格 (R) 的距离对矩阵中的向量求和
sum vectors in a matrix by distance from a cell (R)
假设我有一个矩阵 A
,维度 n x m
。一个起始单元格 (i,j)
,以及一个满足 k < n x m
.
的常数 k
我需要一种方法来提取 A
内的值,以便所有值都在距起始单元格的 k
步内。步骤是列移动或行移动。
然后我希望通过 2 组对提取的值求和,其中 1 组由从原始矩阵中同一列获得的总和组成,另一组是从原始矩阵各行的值求和获得的总和。
对我来说重要的是,这解决了起始单元格在距矩阵边缘 k
步以内的情况。
示例集(我在这里进行了大量简化):
> #create matrix where m = 7,n = 7
> Mat <- sample(1:49,49) %>% matrix(7,7)
>
> #declare starting cell where (i = 4, j = 2)
> i = 4
> j = 2
>
> #declare number of steps
> k = 2
>
> Mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 25 35 29 10 16 46 23
[2,] 32 43 7 5 31 1 14
[3,] 36 19 49 45 13 41 47
[4,] 17 18 48 9 3 28 12
[5,] 26 6 30 33 20 2 11
[6,] 40 24 39 21 37 38 8
[7,] 4 15 34 22 27 44 42
> Mat[i,j]
[1] 18
对于此示例,输出将是两个向量(一个用于列总和,一个用于行总和):
> Columnsum <- c(sum(36,17,26) , #sum(Mat[3:5,1])
+ sum(43,19,18,6,24), #sum(Mat[2:6,2])
+ sum(49,48,30), #sum(Mat[3:5,3])
+ sum(9)) #sum(Mat[4:4,3])
>
> Rowsum <- c(sum(43), #sum(Mat[2,2:2])
+ sum(36,19,49), #sum(Mat[3,1:3])
+ sum(17,18,48,9), #sum(Mat[4,1:4])
+ sum(26,6,30), #sum(Mat[5,1:3])
+ sum(24)) #sum(Mat[6,2:2])
>
> Columnsum
[1] 79 110 127 9
> Rowsum
[1] 43 104 92 62 24
您可以 'remove' 矩阵 Mat
的部分,其中的条目距离 (i,j)
多 k
步,方法是用 NA
覆盖它们:
Mat[abs(row(Mat) - i) + abs(col(Mat) - j) > k] <- NA
然后删除完全NA
:
的行和列
Mat <- Mat[rowSums(is.na(Mat)) != ncol(Mat), colSums(is.na(Mat)) != nrow(Mat)]
最后您可以计算行和列的总和:
Columnsum <- colSums(Mat, na.rm = TRUE)
Rowsum <- rowSums(Mat, na.rm = TRUE)
假设我有一个矩阵 A
,维度 n x m
。一个起始单元格 (i,j)
,以及一个满足 k < n x m
.
k
我需要一种方法来提取 A
内的值,以便所有值都在距起始单元格的 k
步内。步骤是列移动或行移动。
然后我希望通过 2 组对提取的值求和,其中 1 组由从原始矩阵中同一列获得的总和组成,另一组是从原始矩阵各行的值求和获得的总和。
对我来说重要的是,这解决了起始单元格在距矩阵边缘 k
步以内的情况。
示例集(我在这里进行了大量简化):
> #create matrix where m = 7,n = 7
> Mat <- sample(1:49,49) %>% matrix(7,7)
>
> #declare starting cell where (i = 4, j = 2)
> i = 4
> j = 2
>
> #declare number of steps
> k = 2
>
> Mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 25 35 29 10 16 46 23
[2,] 32 43 7 5 31 1 14
[3,] 36 19 49 45 13 41 47
[4,] 17 18 48 9 3 28 12
[5,] 26 6 30 33 20 2 11
[6,] 40 24 39 21 37 38 8
[7,] 4 15 34 22 27 44 42
> Mat[i,j]
[1] 18
对于此示例,输出将是两个向量(一个用于列总和,一个用于行总和):
> Columnsum <- c(sum(36,17,26) , #sum(Mat[3:5,1])
+ sum(43,19,18,6,24), #sum(Mat[2:6,2])
+ sum(49,48,30), #sum(Mat[3:5,3])
+ sum(9)) #sum(Mat[4:4,3])
>
> Rowsum <- c(sum(43), #sum(Mat[2,2:2])
+ sum(36,19,49), #sum(Mat[3,1:3])
+ sum(17,18,48,9), #sum(Mat[4,1:4])
+ sum(26,6,30), #sum(Mat[5,1:3])
+ sum(24)) #sum(Mat[6,2:2])
>
> Columnsum
[1] 79 110 127 9
> Rowsum
[1] 43 104 92 62 24
您可以 'remove' 矩阵 Mat
的部分,其中的条目距离 (i,j)
多 k
步,方法是用 NA
覆盖它们:
Mat[abs(row(Mat) - i) + abs(col(Mat) - j) > k] <- NA
然后删除完全NA
:
Mat <- Mat[rowSums(is.na(Mat)) != ncol(Mat), colSums(is.na(Mat)) != nrow(Mat)]
最后您可以计算行和列的总和:
Columnsum <- colSums(Mat, na.rm = TRUE)
Rowsum <- rowSums(Mat, na.rm = TRUE)