【问题标题】:How to create a diagonal matrix in R?如何在R中创建对角矩阵?
【发布时间】:2011-08-18 03:43:59
【问题描述】:

我有一个包含 250 张表格的 excel 文件(第一张表格包含 250 行和 11 列,第二张表格包含 249 行和 11 列,第三张表格包含 248 行和 11 列等等)。我只需要所有工作表中第 11 列的值来创建对角矩阵。我认为,首先我必须将第 11 列值从 excel 文件导入到 R。基于这些值,我必须创建一个对角矩阵。请帮帮我

【问题讨论】:

  • 一些非常基本的 Google 搜索会出现在 gdata 包中的 read.xls 和用于创建对角矩阵的 diag

标签: r


【解决方案1】:

出于某种奇怪的原因,谷歌查询“r对角矩阵”将我指向此页面,因此我认为在这里回答这个问题是合理的。

R 中最基本的方法是使用函数 diag:

diag(1, 4, 4)

给予:

     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1

【讨论】:

  • 这个通用公式对于将任何你想要的东西放在对角线上很有用,但如果你只想要一个简单的 4×4 单位矩阵,你可以简单地写diag(4)
  • diag(1,4) 也是如此,(允许对角线上的数字不是 1,但可以保存两个完整的字符!)
【解决方案2】:

您可以使用 Matrix 库中的 Diagonal 函数;只需传入维度和值(这似乎是电子表格第 11 列中的内容):

> library(Matrix)
> v = Diagonal(n=5, x=5.5)
> v
  5 x 5 diagonal matrix of class "ddiMatrix"
       [,1] [,2] [,3] [,4] [,5]
  [1,]  5.5    .    .    .    .
  [2,]    .  5.5    .    .    .
  [3,]    .    .  5.5    .    .
  [4,]    .    .    .  5.5    .
  [5,]    .    .    .    .  5.5

(注意:Matrix 需要通过调用 Library 显式导入,虽然它似乎包含在 R 安装中,所以没有单独安装)

【讨论】:

  • 非常感谢您的回答。我试过你的代码。使用您的代码如何从 250 张纸中获取上下三角形值,即第 11 列值。这些值在每张纸上都不同吗?你能解释一下吗?
  • 通过阅读您的问题,我不确定您希望如何将电子表格值映射到 R 中的矩阵。也许最简单的方法是创建“完整”矩阵,然后调用 tril() (下三角)或 triu() 用于提取三角矩阵。
【解决方案3】:

根据您的描述,您确实想要一个三角矩阵,我将展示如何创建一个上三角矩阵:

第 1 步:创建一个矩阵来接收结果:

mat <- matrix(NA, ncol=250, nrow=250)

第 2 步:获取一个函数来读取第 n 个工作表的第 11 列中的 n 行

require(gdata) # to get read.xls or use an equivalent that works with your unstated OS
               # you do need a Perl interpreter and a proper .pm file

第 3 步:遍历 250 张纸并放入矩阵行

for(idx in 1:250 ) { 
   intemp <- read.xls(xlsfilename, sheet = idx )
   mat[ idx, (251-idx):250] <- intemp[1:idx, 11]
         }

有很多方法可能会失败。显而易见的一个是索引超过来自工作表的数据范围的末尾

【讨论】:

  • 非常感谢您的回答。
猜你喜欢
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
相关资源
最近更新 更多