带 R 的双循环(向量乘法和 n 向量创建)

Posted

技术标签:

【中文标题】带 R 的双循环(向量乘法和 n 向量创建)【英文标题】:Double Loop with R (vector multiplication and n vector creation) 【发布时间】:2021-12-17 10:51:34 【问题描述】:

我是 R 的新用户,我正在尝试基于循环将 2 个向量的元素相乘,并由此创建此数据集的 n 个新向量

 A = matrix(data= c(1, 2,3, 4, 5, 6, 7, 8, 9), nrow= 3, ncol= 3)
B = matrix(data= c(6, 1, 3), nrow= 1, ncol = 3)
C = matrix(data= c(5, 2, 2), nrow = 3, ncol= 1)

b.1 = matrix(data= NA, nrow = 1, ncol =ncol(A))
  for (i in 1:ncol(B))
  b.1[1, i] =((A[,i]%*%C[,ncol(C)]/A[nrow(A),i] ))

c.1 <- matrix(data = NA , nrow  = nrow(C) , 1)
  for (j in 1: nrow(C))  
  c.1[j, 1] = (A[j,]%*%B[nrow(B),]/A[j,ncol(A)])  
  
b.2 <-matrix(data=NA, nrow= 1, ncol= ncol(A))
  for (i in 1:ncol(A))
  b.2[1, i] = ((A[,i]%*%c.1[,ncol(c.1)]/A[nrow(A),i] ))
    
c.2 <- matrix(data= NA, nrow = nrow(C), ncol= 1)
  for (j in 1: nrow(C))
  c.2[j,1] = (A[j,]%*%b.1[nrow(b.1),]/A[j,ncol(A)])

在这部分之前,代码可以工作,但我不能使用这个双循环,有人知道为什么吗? 提前致谢

##c.x y b.x
for x in 3:10
  b.[x] <-matrix(data=NA, nrow= 1, ncol= ncol(A))
  for (i in 1:ncol(A))
   b.[x][1, i] = ((A[,i]%*%c.[x-1][,ncol(c.1)]/A[nrow(A),i] ))
c.[x] <- matrix(data= NA, nrow = nrow(C), ncol= 1)
  for (j in 1: nrow(C))
    c.[x][j,1] = (A[j,]%*%b.[x-1][nrow(b.[x-1]),]/A[j,ncol(A)])

【问题讨论】:

for x in 3:10 缺少封闭的括号,是否应该改为 for (x in 3:10) @r2evans 如果我这样说,同样的消息会出现“错误:对象'b。'未找到” 当然。你在哪里定义b.?它不在此代码中。顺便说一句,如果您在控制台上遇到错误,为什么您认为向我们隐藏这些信息是个好主意?如果我们看到object 'b.' not found,我们会立即询问您认为您在哪里定义它。 是的,这个想法是基于 for (x in 3:10) 创建 b.3、b.4、b.5 等。有点基于 stata 的本地命令,'x' 哦,说得好,对不起,我会在我的下一篇文章中添加这种东西 【参考方案1】:

您的确切问题有点复杂,所以我会简化一下,以便您了解哪些地方不工作,以及如何让您的特定代码工作。

##c.x y b.x
for(x in 3:10)
  b.[x] <-matrix(data=NA, nrow= 1, ncol= ncol(A))

# Error: object 'b.' not found

为什么找不到b.?你没有指定它。在 R 中 b.1 和 b.2 不是同一个对象的子集,它们是完全独立的对象。

要在循环中为新对象指定名称,您可以使用以下内容:

for(x in 3:10)
  assign(paste0("b.",x), matrix(data=NA, nrow= 1, ncol= ncol(A)) )

所以现在我们已经创建了名为 b.3b.4b.5、...、b.10 的对象,但您仍然无法在循环中简单地调用 b.[x],因为似乎是一个名为 b. 的对象和该对象中的第 x 个元素,这不是您想要做的。

您必须get() 对象(现在对象是通过最后一步创建的):

for(x in 3:10)
  temp<-get(paste0("b.",x))
  print(temp)


     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA

添加到列然后在嵌套 for 循环中迭代数据帧的愚蠢示例:

for(x in 3:10)
  assign(paste0("b.",x), matrix(data=NA, nrow= 1, ncol= ncol(A)) )
  temp<-get(paste0("b.",x))
  for(i in 1:ncol(A))
     temp[1, i]<-paste("whatever you want +",i)
  
  assign(paste0("b.",x),temp)
 

现在让我们看一下b.4 的其中一个数据框(尽管这段代码都是相同的):

b.4
     [,1]                    [,2]                      [,3] 
[1,] "whatever you want + 1" "whatever you want + 2"   "whatever you want + 3"

因此,您不能像在其他语言中那样仅使用 . 添加到对象。

【讨论】:

非常感谢@Dylan_Gomes,您的见解非常有帮助。我还有一个问题;我如何在'' temp'''行之间指出我想使用 b.n. 的 previus 元素。例如,我想创建向量 b.3,但要创建它需要 b.2。再次感谢您提供有用的见解 如果你想使用之前的对象,只需使用 -1 就像:get(paste0("b.",x-1))。这有意义吗?还是我误解了你的问题? 我想我的解释很糟糕。我需要的是,当我生成一个变量 b.n 时,它取决于元素 b.n-1,它当前没有出现在数据库中,但是随着循环的进行,它应该被创建。我知道 get() 最终生成变量 b.n,但我不知道如何在乘法运算中告诉代码它应该使用循环自动生成的前一个元素, get() 正在检索其中命名的对象——您只需要它,因为我们使用了paste 运算符,否则您可以直接按名称调用对象(例如b.2)。所以如果你想调用前一个对象,你可以像我建议的那样使用上面的行。例如,您可以创建一个临时对象temp&lt;-get(paste0("b.",x-1)),然后在下一个循环中使用这个“上一个”元素。 非常感谢@Dylan_Gomes,我已经解决了我的问题,你只需要在操作中指出温度(有滞后):D

以上是关于带 R 的双循环(向量乘法和 n 向量创建)的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套的 for 循环实现矩阵向量乘法的标量、行变体

DolphinDB 中矩阵和向量的元素乘法

R语言矩阵向量操作(矩阵乘法,向量内积外积(叉乘),矩阵转置,矩阵的逆)

R语言矩阵向量操作(矩阵乘法,向量内积外积(叉乘),矩阵转置,矩阵的逆)

如何进行快速的多维矩阵向量乘法?

设计一个三维向量类,并实现向量的加法,减法以及向量与标量的乘法和除法运算