从执行顺序操作的向量创建三角矩阵

Posted

技术标签:

【中文标题】从执行顺序操作的向量创建三角矩阵【英文标题】:Create a Triangular Matrix from a Vector performing sequential operations 【发布时间】:2015-08-31 12:38:14 【问题描述】:

我一直在尝试解决以下问题。

假设我有以下向量:

aux1<-c(0,0,0,4,5,0,7,0,0,10,11,12) 其中的数字代表行号。

我想计算这个向量的不同元素之间的距离,固定第一个分量,然后是第二个分量,依此类推。

如果元素为零,我不想计算它,所以我放了一个 NA 代替。我想要的输出应该是这样的:

NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
1   NA  NA  NA  NA
NA  NA  NA  NA  NA
3   2   NA  NA  NA
NA  NA  NA  NA  NA
NA  NA  NA  NA  NA
6   5   3   NA  NA
7   6   4   1   
8   7   5   2   1

在第一列中,我有第一个不为零的元素与所有其他元素之间的区别,即 Matrix[5,1]=5-4=1 和 Matrix[12,1]=12-4= 8.此外,Matrix[7,2]=7-5=2,其中 5 是向量中不等于 0 的第二个元素。请注意 Matrix[10,3]=10-7=3,其中 7 是第三个不等于 0 的元素,但在我的向量中是第七个元素。

我尝试循环执行此操作。我当前的代码如下所示:

M=matrix(nrow=N-1, ncol=N-1))

for (i in 1:N-1)
  for (j in 1:N-1)
    if(j<=i)
      next
    else
      if(aux1[j]>0)
      M[j,i]=aux1[j]-aux1[i]
      else
        M[j,i]=0
  

不幸的是。我无法解决我的问题。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以尝试以下方法(在 @thela 的慷慨帮助下)

res <- outer(aux1, head(aux1[aux1 > 0], -1), `-`)
is.na(res) <- res <= 0 
#       [,1] [,2] [,3] [,4] [,5]
#  [1,]   NA   NA   NA   NA   NA
#  [2,]   NA   NA   NA   NA   NA
#  [3,]   NA   NA   NA   NA   NA
#  [4,]   NA   NA   NA   NA   NA
#  [5,]    1   NA   NA   NA   NA
#  [6,]   NA   NA   NA   NA   NA
#  [7,]    3    2   NA   NA   NA
#  [8,]   NA   NA   NA   NA   NA
#  [9,]   NA   NA   NA   NA   NA
# [10,]    6    5    3   NA   NA
# [11,]    7    6    4    1   NA
# [12,]    8    7    5    2    1

【讨论】:

您已经很好的答案的变化:out &lt;- outer(aux1, head(aux1[aux1 &gt; 0],-1), `-`); replace(out, out &lt;= 0, NA)。应该防止在 outer 调用中需要进行很多计算。 @thelatemail 非常好。我进行了相应的修改。在如何避免在所有组合上运行它时让我很头疼。【参考方案2】:

使用sapplyifelse

sapply(head(vv[vv>0],-1),function(y)ifelse(vv-y>0,vv-y,NA))

您循环遍历正值(您还应该删除最后一个元素),然后从原始向量中提取每个值。我用ifelse 替换了负值。

#       [,1] [,2] [,3] [,4] [,5]
#  [1,]   NA   NA   NA   NA   NA
#  [2,]   NA   NA   NA   NA   NA
#  [3,]   NA   NA   NA   NA   NA
#  [4,]   NA   NA   NA   NA   NA
#  [5,]    1   NA   NA   NA   NA
#  [6,]   NA   NA   NA   NA   NA
#  [7,]    3    2   NA   NA   NA
#  [8,]   NA   NA   NA   NA   NA
#  [9,]   NA   NA   NA   NA   NA
# [10,]    6    5    3   NA   NA
# [11,]    7    6    4    1   NA
# [12,]    8    7    5    2    1

【讨论】:

以上是关于从执行顺序操作的向量创建三角矩阵的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 通过循环按执行顺序,做一个5×5的二维数组,赋1到25的自然数,然后输出该数组的左下半三角。

使用完成处理程序按顺序执行操作

进程管理顺序执行和并发执行

如何创建从同一类继承的不同对象的向量?

从具有行主顺序的数组创建特征矩阵

第四十二篇 Numpy的基本操作——索引相关