在矩阵中查找最大连通区域的大小

时间:2018-04-14 07:01:22

标签: r matrix depth-first-search region connected-components

所以我有一个矩阵(n行×m列),想要找到连接最多的区域“1s”。例如,如果我有以下矩阵:

1 1 0 0
0 1 1 0
0 0 1 0
1 0 0 0

矩阵中有2个“1s”区域。

第一区:

1 1
  1 1
    1

第二区:

1

我想创建一个输出最大值= 5的算法。我认为这与Depth First Search有关,但我只有基本R并可以访问一些包。

2 个答案:

答案 0 :(得分:3)

您可以使用SDMTools。首先,我们将矩阵转换为raster,然后检测连接单元格的clump s(补丁)。每个丛都有一个唯一的ID。 NA和零用作背景值。最后,PatchStat提供每个补丁的统计信息。

library(raster)
library(SDMTools)

r <- raster(mat)    
rc <- clump(r)
as.matrix(rc)
     [,1] [,2] [,3] [,4] [,5]
[1,]   NA    1    1    1    1
[2,]    1   NA   NA    1   NA
[3,]    1    1    1   NA    1
[4,]   NA   NA   NA   NA   NA
[5,]    2    2   NA   NA   NA
p <- PatchStat(rc)
max(p$n.cell)  
  

[1] 10

示例数据

set.seed(2)
m <- 5
n <- 5
mat <- round(matrix(runif(m * n), m, n))
mat
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    1    1    1
[2,]    1    0    0    1    0
[3,]    1    1    1    0    1
[4,]    0    0    0    0    0
[5,]    1    1    0    0    0

答案 1 :(得分:2)

我最终使用public function login($username, $password){ $this->db->select('name, password'); $this->db->where('name', $username); $this->db->where('password', $password); $query = $this->db->get('suppliers'); if($query->num_rows() > 0) { $row = $query->row(); $data = array( 'id' => $row->id, 'name' => $row->name, ); $this->session->set_userdata($data); return true; } return false; }

完成了这项工作
 public function login(){
        $username = $this->security->xss_clean($this->input->post('username'));
        $password = $this->security->xss_clean($this->input->post('password'));

        if($this->Supplogin_model->login($username, $password)){
            $this->session->set_flashdata('message', 'You are successfully logged in.');
            redirect("Supplier_login/supplierlogin");
        }
        else{
            $this->session->set_flashdata('error', 'Sorry Unsuccessfull login. Try again.');
            redirect("Supplier_login/supp_login");
        }
    }