c++矩阵类_R语言学习6-矩阵和数据框

v2-0dfdc5d4b0e5068b4b1b2ffc544d3a5c_1440w.jpg?source=172ae18b

在本课程中,我们将学习矩阵和数据帧。

两者都表示矩形数据类型,这意味着它们用于存储具有行和列的表格数据。
这两者的主要区别是,矩阵只能包含一种数据类型,而数据框可以包含多种数据类型。

矩阵

首先,让我们创建一个1-20的向量my_vector

> my_vector <- 1:20
> my_vector
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

然后看看这个向量的维度,使用dim()函数。

> dim(my_vector)
NULL

结果返回的是空值NULL。为什么?因为my_vector只是一个变量,它并没有维度属性。但是可以通过length()获取向量的长度。

> length(my_vector)
[1] 20

可以看到,返回了正确的结果。如果我们想要给my_vector设置维度属性,应该怎么办呢?答案是依然使用dim()函数。通过对my_vector的维度属性进行赋值来设置维度属性。

> dim(my_vector) <- c(4, 5)
> dim(my_vector)
[1] 4 5

我们还可以通过attributes()函数来查看my_vector的维度是否真的已经改变。

> attributes(my_vector)
$dim
[1] 4 5

现在my_vector的维度属性是4 5,这表示my_vector4行,5列。所以,my_vector变成了一个矩阵。

> my_vector
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

使用class()函数,确认my_vector现在的数据类型。

> class(my_vector)
[1] "matrix"

果然,my_vector现在是一个矩阵了。我们将其赋值给一个新的变量my_matrix

> my_matrix <- my_vector

到目前为止,我们使用的示例旨在说明矩阵只是具有维度属性的原子向量。 创建相同矩阵的更直接方法是使用matrix()函数。我们可以通过?matrix命令来获取matrix()函数的用法。

现在我们使用matrix()来创建一个相同的矩阵。

> my_matrix2 <- matrix(1:20, 4, 5)
> identical(my_matrix, my_matrix2)
[1] TRUE

现在,假设我们表中的数字代表了一项临床实验的一些测量结果,其中每一行代表一名患者,每一列代表一个要进行测量的变量。
我们可能要标记行,以便我们知道哪些数字属于实验中的每个患者。通常是在矩阵中添加一列,其中包含所有四个人的姓名。所以我们新建一个patients的字符向量,里面是患者的名字。

> patients <- c("Bill", "Gina", "Kelly", "Sean")

然后我们使用cbind()函数来进行列合并

> cbind(patients, my_matrix)
     patients                       
[1,] "Bill"   "1" "5" "9"  "13" "17"
[2,] "Gina"   "2" "6" "10" "14" "18"
[3,] "Kelly"  "3" "7" "11" "15" "19"
[4,] "Sean"   "4" "8" "12" "16" "20"

我们的结果有些可疑! 看起来,将字符向量与我们的数字矩阵结合在一起会使所有内容都用双引号引起来。 这意味着我们最好得到的是字符串矩阵,这不好。
还记得本课的开头说过的吗?矩阵只能包含一个类的数据。 因此,当我们尝试将字符向量与数字矩阵组合时,R被迫将数字强制为字符,因此使用双引号。这被称为隐式强制,因为我们没有去声明,R自动转换了。

因此,我们还有一个问题,即如何在不破坏数字数据完整性的情况下将患者姓名包括在表格中?这就要用到数据框了。

数据框

要满足我们的需求,可以使用data.frame()函数。

> my_data <- data.frame(patients, my_matrix)
> my_data
  patients X1 X2 X3 X4 X5
1     Bill  1  5  9 13 17
2     Gina  2  6 10 14 18
3    Kelly  3  7 11 15 19
4     Sean  4  8 12 16 20

可以看到结果里的数字,并没有被转成字符串。

data.frame()函数可以有任意数量的参数,并返回由原始对象组成的data.frame类的单个对象。让我们用class()确认一下my_data的类型。

> class(my_data)
[1] "data.frame"

我们还可以为数据框的各个行和列分配名称,这提供了另一种可能的方式来确定表中的值属于哪个患者。

但是,由于我们已经解决了该问题,因此让我们通过为数据框的列分配名称来解决另一个问题,以便我们知道每一列代表的度量类型。

由于我们有6列(包括患者姓名),因此我们需要首先创建一个包含6个元素的向量cnames。每个元素代表每一列的名称。

> cnames <- c("patient", "age", "weight", "bp", "rating", "test")

然后使用colnames()函数来对数据框my_data的列名进行赋值。

> colnames(my_data) <- cnames
> my_data
  patient age weight bp rating test
1    Bill   1      5  9     13   17
2    Gina   2      6 10     14   18
3   Kelly   3      7 11     15   19
4    Sean   4      8 12     16   20

小结

在本课程中,我们学习了使用两个非常重要且通用的数据结构(矩阵和数据帧)的基础知识。 还有很多东西要学习,我们将在以后的课程中涵盖更高级的内容,尤其是关于数据框架的内容。

矩阵

矩阵只能包含一种数据类型,如果两种数据类型的矩阵进行合并,则会被强制转换为一种。

  1. 可以通过dim(),attributes查看矩阵的维度;
  2. matrix()函数创建矩阵;
  3. cbind()函数列合并矩阵。

数据框

数据框可以包含多种数据类型,使用data.frame()函数创建,会保留原始对象。

本文首发于公众号:柠檬培养师(ID: yantinger90),欢迎关注!

R语言学习6-矩阵和数据框​mp.weixin.qq.com
v2-c91c93a82b3d06407b1b4f1f97f691fa_180x120.jpg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用SuiteSparse解决稀疏矩阵方程组,需要遵循以下步骤: 1.安装SuiteSparse库 首先,需要从SuiteSparse官方网站(http://faculty.cse.tamu.edu/davis/suitesparse.html)下载和安装SuiteSparse库。根据您的操作系统,可能需要进行不同的安装步骤。 2.导入必要的头文件 在编写程序时,需要导入一些必要的头文件。在使用SuiteSparse时,应该包括以下头文件: ``` #include "SuiteSparseQR.hpp" #include "SuiteSparse_long.hpp" #include "cholmod.h" ``` 其中,SuiteSparse_long.hpp是必需的,因为SuiteSparse库中使用的整数型是长整型。 3.创建稀疏矩阵 使用SuiteSparse处理稀疏矩阵需要将矩阵存储在特殊的数据结构中。可以使用SuiteSparse中提供的cholmod_sparse结构体来存储矩阵。例如,下面代码创建一个大小为3x3的稀疏矩阵: ``` cholmod_sparse *A; // 定义一个cholmod_sparse结构体指针 A = cholmod_allocate_sparse(3, 3, 6, 1, 1, 0, CHOLMOD_REAL, &c); // 分配内存空间 double *A_value = (double *)A->x; // 矩阵 SuiteSparse_long *A_rowIndex = (SuiteSparse_long *)A->p; // 矩阵的行指针 SuiteSparse_long *A_column = (SuiteSparse_long *)A->i; // 矩阵的列指针 // 设置矩阵元素的 A_value[0] = 1.0; A_rowIndex[0] = 0; A_column[0] = 0; A_value[1] = 2.0; A_rowIndex[1] = 0; A_column[1] = 1; A_value[2] = 3.0; A_rowIndex[2] = 1; A_column[2] = 1; A_value[3] = 4.0; A_rowIndex[3] = 1; A_column[3] = 2; A_value[4] = 5.0; A_rowIndex[4] = 2; A_column[4] = 0; A_value[5] = 6.0; A_rowIndex[5] = 2; A_column[5] = 2; A->stype = 0; // 指定矩阵为非对称矩阵 A->sorted = 1; // 指定矩阵已经排好序 ``` 在这个例子中,矩阵元素的存储在A_value数组中,行指针存储在A_rowIndex数组中,列指针存储在A_column数组中。 4.创建右侧向量 创建右侧向量与创建稀疏矩阵似。可以使用SuiteSparse中提供的cholmod_dense结构体来存储向量。例如,下面代码创建一个大小为3的右侧向量: ``` cholmod_dense *b; b = cholmod_allocate_dense(3, 1, 3, CHOLMOD_REAL, &c); // 分配内存空间 double *b_value = (double *)b->x; // 向量 // 设置向量元素的 b_value[0] = 1.0; b_value[1] = 2.0; b_value[2] = 3.0; ``` 在这个例子中,向量元素的存储在b_value数组中。 5.解决方程组 使用SuiteSparse解决方程组需要调用特定的函数。例如,使用Cholesky分解方法可以调用cholmod_analyze函数和cholmod_factorize函数: ``` cholmod_factor *L; L = cholmod_analyze(A, &c); // 分析矩阵 cholmod_factorize(A, L, &c); // 分解矩阵 cholmod_dense *x; x = cholmod_solve(CHOLMOD_A, L, b, &c); // 解方程组 double *x_value = (double *)x->x; // 解向量 ``` 在这个例子中,使用Cholesky分解方法解决方程组。L是分解后的矩阵,在调用cholmod_solve函数时需要使用。x是解向量,存储在x_value数组中。 6.释放内存空间 在使用完SuiteSparse库后,需要释放分配的内存空间。可以使用SuiteSparse中提供的cholmod_free函数释放内存空间。例如: ``` cholmod_free_sparse(&A, &c); cholmod_free_dense(&b, &c); cholmod_free_factor(&L, &c); cholmod_free_dense(&x, &c); ``` 这些函数将释放之前分配的内存空间。 这些步骤提供了一个使用SuiteSparse库解决稀疏矩阵方程组的基本架。具体实现可能需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值