我需要将矩阵转换为十六进制文件输出。矩阵中的每个条目都需要转换为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,有些为5s。我想要的输出应该类似于
#> 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))
但是ifelse中的8当然是16位整数,因此始终为0x08。我看不到将55s转换为0x88s,将05s转换为0x08s和将50s转换为0x80s的巧妙方法...
是否有一种使R与4位整数一起工作的平滑方法?
答案 0 :(得分:1)
似乎您可以做一些矩阵乘法来提供帮助。首先,我们可以定义一个“翻译矩阵”
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
这应该是有效的,并且不会打扰字符串操作。
答案 1 :(得分:0)
假设我正确理解了您的问题,就可以解决您的问题:
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