Нарезать матрицу квадратами ?

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
sergsh
Активный участник
Сообщения: 205
Зарегистрирован: 20 фев 2013, 21:48
Репутация: 30

Нарезать матрицу квадратами ?

Сообщение sergsh » 07 июн 2015, 17:12

Делаю матрицу ( для примера ) такую :

zz=matrix(1:48,ncol=8)

получаю размер 6*8 :

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 7 13 19 25 31 37 43
[2,] 2 8 14 20 26 32 38 44
[3,] 3 9 15 21 27 33 39 45
[4,] 4 10 16 22 28 34 40 46
[5,] 5 11 17 23 29 35 41 47
[6,] 6 12 18 24 30 36 42 48


КАК нарезать всю матрицу кусочками например 2*2, чтобы получить такие вектора :

с перекрытием квадратов:
1 2 7 8
2 3 8 9
3 4 9 10
...
7 8 13 14

без перекрытия квадратов:
1 2 7 8
3 4 9 10
5 6 11 12
...
13 14 19 20

Это нужно для получения всякой статистики группы соседних пикселей спутникового снимка.

И можно ли сделать выборку не квадратной, а например КРУГЛОЙ или элипсовидной ?
Так как диаграмма рассеяния бывает скорее близкой к элипсу ...

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Нарезать матрицу квадратами ?

Сообщение gamm » 07 июн 2015, 18:23

sergsh писал(а):И можно ли сделать выборку не квадратной, а например КРУГЛОЙ или элипсовидной ?
все можно, но не нужно - будет медленно, даже если векторизовать. Поэтому либо прицепите С++ через Rcpp, либо вообще пишите на С. Есть еще пакет raster, но насколько там эффективно локальное окно реализовано, не знаю.

sergsh
Активный участник
Сообщения: 205
Зарегистрирован: 20 фев 2013, 21:48
Репутация: 30

Re: Нарезать матрицу квадратами ?

Сообщение sergsh » 07 июн 2015, 19:52

В Matlab и в Octave такая штука называется col2im, работает на больших матрицах какие то милисекудны, писать ее на С смысла никакого нет вообще, будет выигрыш на 50 % и это будет 0.05 секунды. Зачем ?

Просто R использую 5 дней, и из нужных функций не все еще нашел ...

Если знаете - скажите пож как она называется в R

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Нарезать матрицу квадратами ?

Сообщение gamm » 07 июн 2015, 20:40

sergsh писал(а):В Matlab и в Octave такая штука называется col2im, работает на больших матрицах какие то милисекудны, писать ее на С смысла никакого нет вообще, будет выигрыш на 50 % и это будет 0.05 секунды. Зачем ?
для R скорость между самим R и С++ обычно отличается на 3-4 порядка. И память R очень любит.

тыц тыц тыц

sergsh
Активный участник
Сообщения: 205
Зарегистрирован: 20 фев 2013, 21:48
Репутация: 30

Re: Нарезать матрицу квадратами ?

Сообщение sergsh » 07 июн 2015, 22:28

Жаль, но по вашим ссылкам немного не то ...
Мне нужно всего лишь нарезать матрицу на квадраты

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Нарезать матрицу квадратами ?

Сообщение gamm » 08 июн 2015, 05:40

sergsh писал(а):Жаль, но по вашим ссылкам немного не то ...
1) по ссылкам то - это итератор, который получает искомые матрицы. Никто не мешает записывать их в глобальный список или array()

2) все аналогичные задачи (например), которые делаются на самом R, основаны на том или итераторе, и будут медленными (если писать явный цикл, то очень-очень медленными). Извлекать можно примерно так (вариантов n!, написал по возможности простой и понятный)

Код: Выделить всё

nx<-6
ny<-6
m<-matrix(1:(nx*ny),ncol=nx,nrow=ny)
# window shifts, 2x2 window, anchor at (0,0)
w.shift<-rbind(c(0,0), c(1,0), c(1,1), c(0,1))
# window anchor positions 
w.pos.x<-1:(nx/2)*2-1
w.pos.y<-1:(ny/2)*2-1
w.pos  <-expand.grid(w.pos.x,w.pos.y)

w.fun<-function(i) {
  cur.pos<-cbind(w.shift[,1]+w.pos[i,1],w.shift[,2]+w.pos[i,2])
  m[cur.pos]
}
w.list<-apply(matrix(1:nrow(w.pos),ncol=1),1,w.fun)

w.pos.x<-1:(nx-1)
w.pos.y<-1:(ny-1)
w.pos  <-expand.grid(w.pos.x,w.pos.y)
w.list<-apply(matrix(1:nrow(w.pos),ncol=1),1,w.fun)

3) возможно, среди 6000 пакетов уже есть С-шная функция, но дешевле написать ее самому
Мне нужно всего лишь нарезать матрицу на квадраты
скорее всего, с этими квадратами что-то нужно делать, а не просто нарезать. Делать можно в итераторе

sergsh
Активный участник
Сообщения: 205
Зарегистрирован: 20 фев 2013, 21:48
Репутация: 30

Re: Нарезать матрицу квадратами ?

Сообщение sergsh » 08 июн 2015, 13:52

Gamm, спасибо за помощь !

6000 пакетов для R - это видимо миф, они похоже повторяют один другого по сто раз, и набегает много
я искал по такой строке

R function rearrange matrix into blocks ( analogue col2im )

и ничего не нашел. А процедура нужная каждый день. И - тем не менее нет.
Для Python кстати тоже нет

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Нарезать матрицу квадратами ?

Сообщение gamm » 08 июн 2015, 14:33

sergsh писал(а):6000 пакетов для R - это видимо миф
это не миф, а медицинский факт. Их только на центральном складе больше 6500, не говоря об отдельных складах типа bioconductor и прочих мелких самопальных хранилищах отдельных частных лиц :mrgreen:
А процедура нужная каждый день. И - тем не менее нет.
еще раз - R не для обработки изображений. От слова совсем. Если что-то нужно из изображения выбрать, есть итераторы, и возможность подключить С/С++. Для обработке изображений в R обычно делают переходник к какому-нибудь ImageMagick/ITK/OpenCV, который написан на С/С++, и оформляют в виде пакета.

sergsh
Активный участник
Сообщения: 205
Зарегистрирован: 20 фев 2013, 21:48
Репутация: 30

Re: Нарезать матрицу квадратами ?

Сообщение sergsh » 08 июн 2015, 16:46

Так изображение - это и есть матрица, иначе говоря таблица с цифрами.
То есть R не для обработки матриц ?

Видимо это не так, иначе обрабатывать будет вообще нечего ...

sergsh
Активный участник
Сообщения: 205
Зарегистрирован: 20 фев 2013, 21:48
Репутация: 30

Re: Нарезать матрицу квадратами ?

Сообщение sergsh » 08 июн 2015, 16:59

Gamm, а какие еще репозитории R-пакетов вы бы могли посоветовать ?

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Нарезать матрицу квадратами ?

Сообщение gamm » 08 июн 2015, 17:18

sergsh писал(а):Так изображение - это и есть матрица, иначе говоря таблица с цифрами.
То есть R не для обработки матриц ?
изображения и матрицы - разные вещи. Матрицы - это линейная алгебра, BLAS, и пр., в R все это есть, но на больших матрицах он тормозит. А изображения - это фильтры, Фурье, сегментация, распознавание образов, и пр., методы практически не пересекаются. Тем более были упомянуты космические снимки, размеры которых нынче 10000х10000. Так что всякие изображения, дифуры на больших сетках, и пр. суровый счет - это только Матлаб. А вот нетривиальное статистическое моделирование и анализ (на небольших данных) - это R.

поэтому репозиториев для R под обработку изображений посоветовать не могу, их нет. А то, что есть другого для обработки изображений, я перечислил.

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей