时间:2021-05-20
【D1 D2】2*1
【T1 T2】1*2
要求D1和D2随机的变动, 矩阵相乘100次
rm(list=ls())gc()options(scipen = 2000)##################写成函数###########3#################定义TT矩阵(1*2)TT <- matrix(c(1,3),1,2)DD<- matrix(c(1,2),2,1)result1 <- DD %*% TTm1=result1######################设定随机取的整数范围x <- 1:100m=data.frame()#################变换DD矩阵(2*1)##############for (i in 2:100){ D2<- matrix(c(sample(x,1,replace=TRUE),sample(x,1,replace=TRUE)),2,1) # print(D2) result <- D2%*% TT print(result) m <- rbind(m,result) result1 <- result %*% result1}(finally_result <- result1)(m_all <- rbind(m,m1))补充:R语言之矩阵操作和运算
对于矩阵A,函数t(A)表示矩阵A的转置,如:
> A=matrix(1:6,nrow=2);> A; [,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6> t(A); [,1] [,2][1,] 1 2[2,] 3 4[3,] 5 6函数det()是求矩阵行列式的值,如
> det(matrix(1:4,ncol=2));[1] -2对于n维向量x,可以看成nxl阶矩阵或lxn阶矩阵。若x与y是相同
维数的向量,则x%*%Y表示x与y作内积.例如,
>x=1:5; Y=2*1:5>x%*%y [,1][1,]110函数crossprod()是内积运算函数(表示交叉乘积),crossprod(x,y)计算向量x与y的内积,即t(x) %*% y'。crossprod(x)表示x与x的内积.
类似地,tcrossprod(x,y)表示'x%*%t(Y)',即x与y的外积,也称为叉积。tcrossprod(x)表示x与x作外积.如:
> x=1:5; y=2*1:5;> crossprod(x); [,1][1,] 55> crossprod(x,y); [,1][1,] 110> tcrossprod(x); [,1] [,2] [,3] [,4] [,5][1,] 1 2 3 4 5[2,] 2 4 6 8 10[3,] 3 6 9 12 15[4,] 4 8 12 16 20[5,] 5 10 15 20 25> tcrossprod(x,y); [,1] [,2] [,3] [,4] [,5][1,] 2 4 6 8 10[2,] 4 8 12 16 20[3,] 6 12 18 24 30[4,] 8 16 24 32 40[5,] 10 20 30 40 50设x和y是n维向量,则x%o%y表示x与y作外积.例如
> x%o%y; [,1] [,2] [,3] [,4] [,5][1,] 2 4 6 8 10[2,] 4 8 12 16 20[3,] 6 12 18 24 30[4,] 8 16 24 32 40[5,] 10 20 30 40 50outer()是更为强大的外积运算函数,outer(x,y)计算向量二与y的外积,它等价于x %o%y函数。
outer()的一般调用格式为 outer(x,y,fun=”*”)
其中x, y矩阵(或向量),fun是作外积运算函数,缺省值为乘法运算。函数outer()在绘制三维曲面时非常有用,它可生成一个x和y的网格。
设A和B为两个矩阵,通常意义下的矩阵乘法是通过A%*%B来完成,crossprod(A,B)表示的是
t(A)%*%B,而tcrossprod(A,B)表示的是A%*%t(B)。最后我们通过运算知道x%*%A%*%x为二次型。
> A=array(1:9,dim=(c(3,3)))> B=array(9:1,dim=(c(3,3)))> A%*%B; [,1] [,2] [,3][1,] 90 54 18[2,] 114 69 24[3,] 138 84 30> crossprod(A,B)==t(A)%*%B; [,1] [,2] [,3][1,] TRUE TRUE TRUE[2,] TRUE TRUE TRUE[3,] TRUE TRUE TRUE> tcrossprod(A,B)==A%*%t(B); [,1] [,2] [,3][1,] TRUE TRUE TRUE[2,] TRUE TRUE TRUE[3,] TRUE TRUE TRUE函数diag()依赖于它的变量,当v是一个向量时,diag(v)表示以v的元素为对角线元素的对角阵.当M是一个矩阵时,则diag(M)表示的是取M对角线上的元素的向量.如
> v=c(1,4,5);> diag(v); [,1] [,2] [,3][1,] 1 0 0[2,] 0 4 0[3,] 0 0 5> M=array(1:9,dim=c(3,3));> diag(M);[1] 1 5 9若求解线性方程组Ax=b,其命令形式为solve(A,b),求矩阵A的逆,其命令形式为solve(A).设矩阵A=t(array(c(1:8,10),dim=c(3,3))),b<-c(1,1,1),则解方程组Ax=b的解x和求矩阵A的逆矩阵的命令如下:
> A=t(array(c(1:8,10),dim=c(3,3)));> b=c(1,1,1);> x=solve(A,b);> x;[1] -1.000000e+00 1.000000e+00 3.806634e-16> solve(A); [,1] [,2] [,3][1,] -0.6666667 -1.333333 1[2,] -0.6666667 3.666667 -2[3,] 1.0000000 -2.000000 1函数eigen(Sm)是求对称矩阵Sm的特征值与特征向量,其命令形式为:ev=eigen(Sm),则ev存放着对称矩阵Sm特征值和特征向量,是由列表形式给出的,其中ev$values是Sm的特征值构成的向量,ev$vectors是Sm的特征向量构成的矩阵.如
> Sm=crossprod(A,A);> ev=eigen(Sm);> ev;$values[1] 303.19533618 0.76590739 0.03875643$vectors [,1] [,2] [,3][1,] -0.4646675 0.833286355 0.2995295[2,] -0.5537546 -0.009499485 -0.8326258[3,] -0.6909703 -0.552759994 0.4658502以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了C语言实现两个矩阵相乘的具体代码,供大家参考,具体内容如下程序功能:实现两个矩阵相乘的C语言程序,并将其输出代码如下:#include"st
1.矩阵相乘矩阵相乘应满足的条件:(1)矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘;(2)矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列
动态规划法题目描述:给定n个矩阵{A1,A2....An},其中Ai与Ai+1是可以相乘的,判断这n个矩阵通过加括号的方式相乘,使得相乘的次数最少!以矩阵链AB
一、矩阵乘法定义矩阵Ax×y和矩阵Bu×v相乘的前提条件是y==u,并且相乘后得到的矩阵为Cx×v(即A的行和B的列构成了矩阵C的行列);二、矩阵类封装我们用C
SVD是矩阵分解常用的方法,其原理为:矩阵M可以写成矩阵A、B与C相乘得到,而B可以与A或者C合并,就变成了两个元素M1与M2的矩阵相乘可以得到M。矩阵分解推荐