Абстрактная алгебра и [закрытое] Программирование

Как насчет использования Reduce с dplyr::coalesce?

library(dplyr)

df <- data.frame(grp_A = c(13, NA, NA, NA, NA, 20, NA),
                 grp_B = c(NA, 59, 66, NA, NA, NA, NA),
                 grp_C = c(NA, NA, NA, 23, 42, NA, NA))

mutate(df, value = Reduce(coalesce, df))

Результат:

  grp_A grp_B grp_C value
1    13    NA    NA    13
2    NA    59    NA    59
3    NA    66    NA    66
4    NA    NA    23    23
5    NA    NA    42    42
6    20    NA    NA    20
7    NA    NA    NA    NA

Другой вариант - использовать rowSums:

df$value <- rowSums(df, na.rm = T)

df[df$value == 0, ] <- NA 
[ 1111] Кроме того, с точки зрения производительности, базовое Reduce решение представляется наиболее эффективным:

microbenchmark::microbenchmark(
  Reduce = Reduce(coalesce, df), 
  purrr = purrr::reduce(df, coalesce),
  rowMeans = rowMeans(df,na.rm=T), 
  rowSums = rowSums(df, na.rm = T), 
  cbind = df[cbind(1:nrow(df), max.col(!is.na(df)))],
  times = 1000
)

Unit: microseconds
     expr     min       lq     mean   median       uq       max neval cld
   Reduce  83.507 107.2095 145.4134 121.4320 137.8410 12190.845  1000  a 
    purrr 205.667 269.1175 357.5908 304.8540 342.4135 24316.051  1000   b
 rowMeans 129.089 159.3555 196.1438 174.4890 194.9095  5481.523  1000  a 
  rowSums 129.454 157.1680 197.2731 173.5775 196.0035  7685.874  1000  a 
    cbind 267.294 331.8385 408.3179 368.4860 410.2400  4533.050  1000   b
26
задан alfC 21 May 2018 в 03:12
поделиться

8 ответов

Текст, который Вы хотите здесь, Абстрактная алгебра, Вычислительный Подход Chuck Sims. Автор рекомендует использовать язык программирования APL . Книга распродана, но можно, вероятно, найти его в библиотеке.

существует также Компьютерная Система Алгебры GAP , который является забавой использовать для теории групп.

Усовершенствованные ресурсы:

Магма : довольно сложный CAS, который может обработать широкий спектр понятий от абстрактной алгебры.
Macaulay 2: используемый для изучения полиномиальных колец, особенно основания GrГ¶bner .
ИСКЛЮЧИТЕЛЬНЫЙ : используемый для изучения полиномиальных колец.

факт ключа А в изучении теории групп - то, что каждая группа изоморфна к группа подстановок регулярным действием. Таким образом ключ к пониманию теории групп должен понять группы подстановок.

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

20
ответ дан Sam Hasler 28 November 2019 в 06:23
поделиться

Возможно, немного отличающееся взятие по Вашему вопросу, но все еще... Функциональный язык Haskell использует понятия от алгебры (особенно теория категорий), такие как монады, моноиды, стрелки и этажерка.

Используя typeclasses Haskell, Вы могли также превратить любой объект в группу или кольцо, например, просто путем определения операций (операторы) на них. Гарантия, что операции Вы определяете на самом деле, соответствует аксиомам группы/кольца, была бы Ваша ответственность, как бы то ни было.

33
ответ дан Thomas 28 November 2019 в 06:23
поделиться

Mathematica имеет много полезных функций для контакта с понятиями в абстрактной алгебре. К сожалению, это - собственное программное обеспечение и очень дорогой. Sage является свободной альтернативой, которая также имеет довольно хороший репертуар функций абстрактной алгебры, хотя я не использовал его как экстенсивно, таким образом, я не могу прокомментировать намного больше его.

4
ответ дан Adam Rosenfield 28 November 2019 в 06:23
поделиться

Любой язык с целыми числами без знака фиксированного размера (например, эти unsigned int тип в C) является примером такой реализации. Дополнение с неподписанными значениями является по существу тем же как дополнением по <глотку> Z 2 32 (т.е. целые числа по модулю 2 <глоток> 32 ), о котором Вы, вероятно, узнаете в Вашем классе абстрактной алгебры.

Модульное дополнение по такой группе не ужасно интересно, все же. Более интересный могло бы быть модульное дополнение по группе размера N, где N имеет простые множители всего кроме 2, или размер P, где P является началом. Для экспериментирования с такими группами Вам, вероятно, придется реализовать такие арифметические операции самим (это не твердо). Языки с перегрузкой оператора могут сделать реализацию намного более удобной для использования.

3
ответ дан Greg Hewgill 28 November 2019 в 06:23
поделиться

Используйте язык, который имеет большую часть смысла Вам. Абстрактная алгебра содержит большое управление символом (продвижение символа) и перезапись, скромный объем индукции и изрядное количество скуки. Мне, который походит на логическое или функциональное программирование; Epigram и Agda делают немного это, и Haskell делает в некоторой степени (хотя я не соглашаюсь, что моноид корректен, mzero и mappend хорошо, mconcat: плохо). Для абстрактной алгебры лучший язык программирования является ноутбуком Определения и бумагой тонн. Хотя этот становится довольно тайным в эти дни.

3
ответ дан 28 November 2019 в 06:23
поделиться

В том же духе к ответу Greg, у групп есть хорошее представление в форме умножение матриц, таким образом, Вы часто видите примеры, сделанные с помощью matlab или подобные инструменты...

0
ответ дан dmckee 28 November 2019 в 06:23
поделиться

Хм ... извините, но я не думаю, что эффективно выучить какой-то новый модный язык программирования по порядку чтобы помочь вам выучить абстрактную алгебру.

Да, Хаскелеры любят говорить о теории категорий, но это не очень хорошая отправная точка.

GAP and co. используются, чтобы помочь взрослым групповым теоретикам найти новых «монстров» - они плохие инструменты для изучения теории групп.

Может быть, вы можете взглянуть на это: http://freecomputerbooks.com/mathAlgebraBooks.html - вокруг этой темы много бесплатных книг.

3
ответ дан Carsten 28 November 2019 в 06:23
поделиться

Если вы играете с группами, вы можете визуализировать их с помощью Group explorer .

5
ответ дан 28 November 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: