Как правильно представить 4-битные целые числа? - PullRequest
1 голос
/ 18 апреля 2019

Мне нужно преобразовать матрицу в вывод шестнадцатеричного файла.Каждая запись в матрице должна быть переведена в 4-битную шестнадцатеричную цифру (8) и выведена в одномерном массиве.

> matrix(c(0,0,0,5,0,0,5,5,0,0,5,0),nrow=3,ncol=4,byrow=T)
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    5
[2,]    0    0    5    5
[3,]    0    0    5    0

Это матрица из 3 строк, 4 столбца, в основном 0 и около 5,Мой желаемый вывод должен быть чем-то похожим на

#> as.raw(c(0,8,0,136,0,128))
> as.raw(solution)
[1] 00 08 00 88 00 80

Я пытался сделать несколько простых

> sidewaysraw<-as.raw(ifelse(mymat==5, 8,0))

, но 8 в ifelse, конечно, является 16-битным целым числом, так что это всегда0x08.Я не вижу удобного способа перевода 55-х в 0x88s, 05-х в 0x08-х и 50-х в 0x80-х ...

Есть ли плавный способ заставить R работать с 4-битными целыми числами?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Кажется, что вы могли бы сделать некоторое умножение матриц, чтобы помочь. Сначала мы можем определить «матрицу перевода»

digits <- matrix(c(128,8,0,0,0,0,128,8), nrow=4, ncol=2)

Тогда вы можете получить свои номера с

(dd==5) %*% digits
#      [,1] [,2]
# [1,]    0    8
# [2,]    0  136
# [3,]    0  128

и затем извлеките их в правильном порядке с транспозицией

as.raw(t((dd==5) %*% digits))
# [1] 00 08 00 88 00 80

Это должно быть эффективно и не беспокоить при работе со строками.

0 голосов
/ 18 апреля 2019

Если я правильно понял ваш вопрос, это решит вашу проблему:

mat <- matrix(c(0,0,0,5,0,0,5,5,0,0,5,0),nrow=3,ncol=4,byrow=T)
mat_new <- matrix(t(mat),ncol=2,byrow=T) #reformat to 2 columns
vec <- apply(mat_new,1,function(row)
{
  num <- paste0(row,collapse="") #collapse the rows
  if(num == "00") return(as.raw(0)) #switch the resulting char
  else if(num == "05") return(as.raw(8))
  else if(num == "50") return(as.raw(128))
  else if(num == "55") return(as.raw(136))
})

vec
[1] 00 08 00 88 00 80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...