首页 > 解决方案 > 按与单元格的距离 (R) 对矩阵中的向量求和

问题描述

假设我有一个A维度矩阵n x m。一个起始单元格和一个满足(i,j)的常数。kk < n x m

我需要一种方法来提取其中的值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

标签: rmatrixmatrix-multiplication

解决方案


您可以通过使用以下内容覆盖它们,从而“删除”矩阵Mat中的条目超过k几步之遥的部分:(i,j)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)

推荐阅读