在R中从向量移动到矩阵
我有一个从1到105的数字列表。我想移动到一个具有对角值的较低的三角形矩阵。但是,我不希望此矩阵按行填充,而是希望采用以下模式: 这个矩阵中的数字指的是列表(x)中我想在矩阵中看到的元素。例如,我的列表中的数字64应该在矩阵的左下角 现有的函数(如在R中从向量移动到矩阵,r,matrix,R,Matrix,我有一个从1到105的数字列表。我想移动到一个具有对角值的较低的三角形矩阵。但是,我不希望此矩阵按行填充,而是希望采用以下模式: 这个矩阵中的数字指的是列表(x)中我想在矩阵中看到的元素。例如,我的列表中的数字64应该在矩阵的左下角 现有的函数(如lower.tri或matrix(x,byrow=TRUE)在这里似乎不起作用,所以我对如何处理这个问题有些迷茫 x <- c(1:105) x编辑:自动方式 这是一个函数,应该照顾你的要求 code_matrix <- functio
lower.tri
或matrix(x,byrow=TRUE)
在这里似乎不起作用,所以我对如何处理这个问题有些迷茫
x <- c(1:105)
x编辑:自动方式
这是一个函数,应该照顾你的要求
code_matrix <- function(p, change_col = 6) {
# we will create the transpose of the desired matrix first
# this handles the row wise assignment
# initialize your matrix
m <- matrix(0, p, p)
# create a logical upper triangular to track where we will put values
a <- matrix(T, p, p)
a[lower.tri(a)] <- F
# tracks what the last number from the prior block was
end_num <- 0
# how many blocks of columns to divide things into based on the rule
m_blocks <- 1:ceiling(p / change_col)
# loop through each of the blocks
for (i in m_blocks) {
# calculate the start and end rows in the block
start_row <- (i - 1) * change_col + 1
end_row <- min(start_row + (change_col - 1), p)
# create the sequence of numbers
v <- end_num + 1:sum(a[start_row:end_row,])
# store the sequence back into the matrix by using the logical matrix
m[start_row:end_row,][a[start_row:end_row,]] <- v
# increase the tracker
end_num <- max(v)
}
return(t(m))
}
有几件事。只是为了清理语言,你有一个数字向量,而不是一个数字列表。其次,这不是一个下三角矩阵。在下三角矩阵中,对角向量都是零。你没有。你提前知道平方矩阵的大小吗?或者你想从向量计算,x
?这是very类似于这里的问题:另外,你的图片中第6列和第7列之间发生了什么?为什么行模式会改变?这准确吗?亚当,谢谢你在语言方面的帮助。我如何调用对角线上有值的低对角线矩阵?我会提前知道方阵的大小。在这个场景中,它将是14x14,但是,我正在努力达到这样一个点:通过知道我的数字向量中元素的数量,我将找到方阵的宽度或长度。维基百科上的下三角矩阵的定义与你最初的用法一致,@paulussatkus。“如果主对角线上方的所有条目都为零,则正方形矩阵称为下三角形。”亚当,是的,图片是准确的,有“奇怪”"在第6列和第7列之间,以及第12列和第13列之间发生的事情。这种格式正是我努力寻找解决方案的原因。否则,下面的解决方案会起作用。这会起作用。但是,我想知道是否有函数或方法可以这样做的部分原因是因为我计划使用不同的长度。虽然这个解决方案适用于14x14矩阵,但对于13x13或12x12矩阵等,不同的尺寸是必要的。是的,我想。但你必须说明模式。你如何知道何时开始新模式?是在70?是在一定数量的列之后吗?有一些基本规则需要说明模式移动的时间和原因。如果没有这一点,我认为你不会得到更强大的东西。我能想到的唯一真正的规则是,每6列之后都会出现“古怪”将发生。使用13x13矩阵,而不是70,它将是64,使用12x12,它将是58,依此类推,因此它将减少6。使用14x14矩阵,显然有14列,因此列中断将发生两次,在第6列之后和第12列之后。使用19x19矩阵,我们将有三次列中断-在第6、第12和第12列之后18.我之所以提出这个问题,是因为不寻常的值将在每列分隔符后开始,这些信息应该出现在原始问题中。我认为我刚才添加的函数应该可以做到这一点。谢谢Adam,这太棒了!
> code_matrix(14)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,] 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 2 3 0 0 0 0 0 0 0 0 0 0 0 0
[3,] 4 5 6 0 0 0 0 0 0 0 0 0 0 0
[4,] 7 8 9 10 0 0 0 0 0 0 0 0 0 0
[5,] 11 12 13 14 15 0 0 0 0 0 0 0 0 0
[6,] 16 17 18 19 20 21 0 0 0 0 0 0 0 0
[7,] 22 23 24 25 26 27 70 0 0 0 0 0 0 0
[8,] 28 29 30 31 32 33 71 72 0 0 0 0 0 0
[9,] 34 35 36 37 38 39 73 74 75 0 0 0 0 0
[10,] 40 41 42 43 44 45 76 77 78 79 0 0 0 0
[11,] 46 47 48 49 50 51 80 81 82 83 84 0 0 0
[12,] 52 53 54 55 56 57 85 86 87 88 89 90 0 0
[13,] 58 59 60 61 62 63 91 92 93 94 95 96 103 0
[14,] 64 65 66 67 68 69 97 98 99 100 101 102 104 105