能否用R torch包改写CPU上的for循环?报错问题求助
用R torch包改写CPU矩阵拼接代码的解决方案
原CPU代码逻辑是循环3次,每次生成2x2矩阵,转置后通过rbind拼接成最终的6x2矩阵。你的torch改写代码报错的原因大概率是列表索引处理的问题,以下是修正后的实现:
方法1:直接循环拼接空张量
这种方式和原代码的rbind逻辑完全对应,逐步构建最终张量:
# 初始化空张量,指定行数为0,列数为2,设备为cuda BT <- torch_empty(0, 2, device = "cuda") for(t in 1:3) { # 直接创建2x2张量(避免先转matrix,更符合torch习惯) B_rt <- torch_tensor(c(1, 2, 3, 4), shape = c(2, 2), device = "cuda") # 转置后拼接至BT的行维度(dim=0对应行) BT <- torch_cat(list(BT, torch_t(B_rt)), dim = 0) }
方法2:用列表收集张量后拼接(修正索引问题)
如果你偏好先收集所有张量再拼接,建议用append避免索引空洞问题:
BT <- list() for(t in 1:3) { B_rt <- torch_tensor(c(1, 2, 3, 4), shape = c(2, 2), device = "cuda") # 用append向列表末尾添加张量,确保列表元素连续无空洞 BT <- append(BT, list(torch_t(B_rt))) } # 沿行维度拼接所有张量 BT <- torch_cat(BT, dim = 0)
关键说明
- 原代码中用
matrix转张量是可行的,但直接用torch_tensor指定shape更高效,且避免R矩阵的列优先特性可能带来的混淆(两者结果一致,但写法更简洁)。 - 报错提示"Indexing starts at 1 but found a 0"通常是因为列表中存在未赋值的索引位置(空洞),用
append可以彻底避免这个问题。 - 两种方法最终得到的张量和原CPU代码的
BT矩阵数值完全一致,且运行在cuda设备上。
内容的提问来源于stack exchange,提问作者Alison
相关产品推荐
相关产品推荐

