Как преобразовать матрицу из списка матриц в двумерную числовую / матрицу, не включенную в список, без сглаживания вектора в R? - PullRequest
0 голосов
/ 18 июня 2019

Итак, у меня есть большой список матриц, и я хочу иметь возможность брать их одну за другой и выводить их из списка в их обычные двумерные индивидуальные матрицы.Итак, допустим, у меня есть список примеров матриц.Я получил список с этим кодом:

examplelist <- lapply (listofimages, readImage) </p>

А вот один пример изображения 512x512 .tif, который будет одним изМатрицы в списке матриц:

Список выглядит так:

Example matrix list

Iхочу вынимать одну матрицу за раз в виде двумерной матрицы 512x512, но когда я пытаюсь урезать другие данные вручную, это все равно элемент списка (одинарные кавычки, чтобы на индекс не ссылались):

a <- as.matrix (examplelist ['1']) </p>

b <- a [,] </p>

enter image description here

И когда я это делаю, он превращается в одномерный вектор:

b <- as.numeric (unlist (examplelist ['1']))) </p>

enter image description here

Что составляет 262144 x 1 вместо 512 x 512.

Я попытался преобразовать его в таблицу данных, фрейм данных и несколько других вещей, а затем, когдаЯ пытаюсь сделать его числовым:

as.numeric (b)

Я получаю эту ошибку:

enter image description here

Используя dput, он перечисляет это как ошибку:

enter image description here

Существует ли простой способ выделить квадратную матрицу из списка матриц и получить ее в исходной форме 512 x 512 вместо1D вектор (как видно выше)?

Я попытался обрезать размеры (как показано выше), чтобы избавиться от какой-то другой информации, но она вызвала ошибку.Я также попытался получить доступ только к атрибутам данных, используя '@' и '$', но это тоже не сработало.

Если я попробую это:

b <- as.data.table (examplelist ['1']) </p>

Это просто дает мне еще один вектор 212144 x 1 1D вместо желаемой 2D матрицы.

Это решение и это , не работает, потому что я не хочу 1D-вектор или преобразовывать только элементы (мне нужна вся матрица) в числовые элементы.

1 Ответ

1 голос
/ 18 июня 2019

Для извлечения элемента из списка вам необходимо использовать двойные скобки. Рассмотрим пример ниже. Давайте создадим список матриц.

# Dummy list
foo <- list(first = matrix(runif(16), ncol = 4),
            second = matrix(runif(16), ncol = 4))

Это выглядит следующим образом:

# Quick peek
print(foo)
#> $first
#>           [,1]      [,2]       [,3]      [,4]
#> [1,] 0.3517863 0.1222894 0.69358440 0.7850944
#> [2,] 0.7516454 0.9881041 0.72152473 0.3035514
#> [3,] 0.8540138 0.3966431 0.40551019 0.3687717
#> [4,] 0.8872717 0.7438446 0.03258007 0.1305907
#> 
#> $second
#>            [,1]       [,2]       [,3]       [,4]
#> [1,] 0.57426947 0.59617809 0.05355548 0.05962695
#> [2,] 0.60420788 0.06640785 0.43616808 0.03359352
#> [3,] 0.44216820 0.58033207 0.22686284 0.42624557
#> [4,] 0.08838313 0.27258925 0.71353586 0.76606084

Теперь давайте посмотрим на первый элемент, используя только один набор скобок.

# Extract one element as a list
a <- foo['first'] # Or foo[1]

# Examine output
print(a)
#> $first
#>           [,1]      [,2]       [,3]      [,4]
#> [1,] 0.3517863 0.1222894 0.69358440 0.7850944
#> [2,] 0.7516454 0.9881041 0.72152473 0.3035514
#> [3,] 0.8540138 0.3966431 0.40551019 0.3687717
#> [4,] 0.8872717 0.7438446 0.03258007 0.1305907
class(a)
#> [1] "list"

Вы заметите, что это список. Давайте попробуем использовать два набора скобок.

# Extract one element
b <- foo[['first']] # Or foo[[1]]

# Examine output
print(b)
#>           [,1]      [,2]       [,3]      [,4]
#> [1,] 0.3517863 0.1222894 0.69358440 0.7850944
#> [2,] 0.7516454 0.9881041 0.72152473 0.3035514
#> [3,] 0.8540138 0.3966431 0.40551019 0.3687717
#> [4,] 0.8872717 0.7438446 0.03258007 0.1305907
class(b)
#> [1] "matrix"

Создано в 2019-06-18 пакетом представ. (v0.3.0)

Это матрица! Кроме того, он сохраняет первоначальную структуру матрицы.

...