Как построить спиральную матрицу в R? - PullRequest
1 голос
/ 14 апреля 2020

Я пытался создать спиральную матрицу, как показано ниже (заданный размер N, где N=4 на следующем рисунке)

enter image description here

Есть ли пакет R, который это реализовал? Я не нашел это. Иначе, кто-нибудь может мне помочь встроить его в базовые операции R? Заранее спасибо!

1 Ответ

3 голосов
/ 14 апреля 2020

Я не уверен, есть ли пакет, в том числе спиральная матричная конструкция, поэтому я просто предоставляю базовое решение R

SpiralMatrix <- function(n) {
  M <- matrix(nrow = n,ncol = n);
  #  start from element M(1,1)
  i <- j <- 1;
  s <- 1; # first element assigned to M(1,1)
  M[i,j] = s;
  repeat {
    #  fill row from left to right
    idx <- tail(which(is.na(M[i,])),1);
    M[i,j:idx] <- s + (0:(idx-j));
    s <- s + idx - j;
    j <- idx;
    if (all(!is.na(M))) break

    #  fill column from top to bottom
    idx <- tail(which(is.na(M[,j])),1);
    M[i:idx,j] <- s + (0:(idx-i));
    s <- s + idx - i;
    i <- idx;
    if (all(!is.na(M))) break

    #  fill row from right to left
    idx <- head(which(is.na(M[i,])),1);
    M[i,j:idx] <- s + (0:(j-idx));
    s <- s + j - idx;
    j <- idx;
    if (all(!is.na(M))) break

    # fill column from bottom to top
    idx <- head(which(is.na(M[,j])),1);
    M[i:idx,j] <- s + (0:(i-idx));
    s <- s + i-idx;
    i <- idx;
    if (all(!is.na(M))) break
  }
  M
}

, такое что

> SpiralMatrix(5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]   16   17   18   19    6
[3,]   15   24   25   20    7
[4,]   14   23   22   21    8
[5,]   13   12   11   10    9
> SpiralMatrix(4)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   12   13   14    5
[3,]   11   16   15    6
[4,]   10    9    8    7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...