Преобразовать код Грея в десятичный в R

StackOverflow https://stackoverflow.com//questions/20038185

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть набор 0 и 1, представленный в виде списка, изначально созданного с помощью sample(c(0,1), n, replace=TRUE), где n — длина моего двоичного числа.В настоящее время я использую конвертер BCD для преобразования двоичного числа в десятичное число, это видно здесь:

BCD.to.Decimal <- function(binaryNumb)
{
  binaryLength = length(binaryNumb)
  decimalNumb = 0
  for(i in 1:binaryLength)
  {
    if ( binaryNumb[i] == 1)
      decimalNumb = decimalNumb + 2^(binaryLength - i)
 }

  decimalNumb
}

Вместо этого я хотел бы использовать преобразователь GrayCode.To.Decimal, который выполняет ту же работу, что и мой преобразователь BCD.to.Decimal, но вместо этого использует код Грея.

Примечание:Скорость ДЕЙСТВИТЕЛЬНО имеет значение для этого, и я хотел бы сделать это наиболее эффективным способом.Я знаю, что мой BCD-конвертер, вероятно, не самый эффективный, он просто самый простой. Если у вас есть значительно более эффективный способ обработки BCD-преобразования, мне также было бы интересно услышать об этом.

Что такое код Грея?: http://en.wikipedia.org/wiki/Gray_code

Это было полезно?

Решение 2

Вот простое решение моего вопроса, алгоритм оказался намного проще, чем впервые появился.Используемый алгоритм можно найти Здесь .

GrayCode.to.Decimal <- function(grayNumb)
{
  binaryNumb = vector("numeric",length(grayNumb))
  binaryNumb[1] = grayNumb[1]
  for (i in 2:length(grayNumb))
  {
    binaryNumb[i] = xor(grayNumb[i], binaryNumb[i - 1])
  }

  return(Binary.to.Decimal(binaryNumb))
}
.

Этот код преобразует код в двоичный файл, в котором вы можете использовать двоичное преобразование для преобразования его в десятичное число.Я решил использовать код, предоставляемый Flodel в разделе комментариев.

Binary.to.Decimal <- function(binaryNumb)
{
  L = length(binaryNumb)
  sum(2L^(seq_along(binaryNumb)-1L) * rev(binaryNumb))
}
.

Другие советы

Ну, на этой вики-странице есть алгоритм преобразования, хотя и в c так что вам придется его портировать.
Опять же на вики-странице есть эта ссылка http://aggregate.org/MAGIC/#Gray%20Code%20Conversionв котором перечислен ряд алгоритмов преобразования, большинство из которых кажутся довольно простыми в написании.

Кстати, да ладно: GA::grey2binary и GA::binary2grey уже существует.ба :-)

ETA - мне посчастливилось найти это через Mr.Google но в целом посылка sos — отличный инструмент R-поиска.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top