等宽矩阵(a)相乘a %*% x = b的逆运算solve(a,b)=x
> a <- matrix(1:12,2,6)
> x <- matrix(1:12,6,2)
> a[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 3 5 7 9 11
[2,] 2 4 6 8 10 12
> x[,1] [,2]
[1,] 1 7
[2,] 2 8
[3,] 3 9
[4,] 4 10
[5,] 5 11
[6,] 6 12
> b <- a %*% x
> b[,1] [,2]
[1,] 161 377
[2,] 182 434
> solve(a,b)
Error in solve.default(a, b) : 'a' (2 x 6) must be square
F77_CALL(dgesv)(&n, &p, avals, &n, ipiv, REAL(B), &n, &info);if (info < 0)error(_("argument %d of Lapack routine %s had invalid value"),-info, "dgesv");if (info > 0)error(_("Lapack routine %s: system is exactly singular: U[%d,%d] = 0"),"dgesv", info, info);
错误举例 :
> a <- matrix(1:16,4,4)
> solve(a, a %*% a)
Error in solve.default(a, a %*% a) : Lapack routine dgesv: system is exactly singular: U[3,3] = 0
> a <- matrix(1:4,2,2)
> a[,1] [,2]
[1,] 1 3
[2,] 2 4
> solve(a) # solve(a) , 不给b的话, 其实b 默认就是和a维度一致并且对角线为1的矩阵.[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> solve(a, diag(1,2,2)) # 可以看到[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> diag(1,2,2)[,1] [,2]
[1,] 1 0
[2,] 0 1
> a %*% solve(a) # 因为solve(a,b) = x, a %*% x = b, 所以 a %*% solve(a) = b = diag(1,2,2)[,1] [,2]
[1,] 1 0
[2,] 0 1
b还可以是向量, 向量会自动转成矩阵, 例如
> solve(a, c(2,3))
[1] 0.5 0.5
> a %*% solve(a, c(2,3))[,1]
[1,] 2
[2,] 3
[参考]
solve package:base R DocumentationSolve a System of EquationsDescription:This generic function solves the equation ‘a %*% x = b’ for ‘x’,where ‘b’ can be either a vector or a matrix.Usage:solve(a, b, ...)## Default S3 method:solve(a, b, tol, LINPACK = FALSE, ...)Arguments:a: a square numeric or complex matrix containing thecoefficients of the linear system. Logical matrices arecoerced to numeric.b: a numeric or complex vector or matrix giving the right-handside(s) of the linear system. If missing, ‘b’ is taken to bean identity matrix and ‘solve’ will return the inverse of‘a’.tol: the tolerance for detecting linear dependencies in thecolumns of ‘a’. The default is ‘.Machine$double.eps’. Notcurrently used with complex matrices ‘a’.LINPACK: logical. Defunct and ignored....: further arguments passed to or from other methods
2.
/* Real case of solve.default */
static SEXP La_solve(SEXP A, SEXP Bin, SEXP tolin)
{int n, p;double *avals, anorm, rcond, tol = asReal(tolin), *work;SEXP B, Adn, Bdn;if (!(isMatrix(A) && (TYPEOF(A) == REALSXP || TYPEOF(A) == INTSXP || TYPEOF(A) == LGLSXP)))error(_("'a' must be a numeric matrix"));int *Adims = INTEGER(coerceVector(getAttrib(A, R_DimSymbol), INTSXP));n = Adims[0];if(n == 0) error(_("'a' is 0-diml"));int n2 = Adims[1];if(n2 != n) error(_("'a' (%d x %d) must be square"), n, n2);Adn = getAttrib(A, R_DimNamesSymbol);if (isMatrix(Bin)) {int *Bdims = INTEGER(coerceVector(getAttrib(Bin, R_DimSymbol), INTSXP));p = Bdims[1];if(p == 0) error(_("no right-hand side in 'b'"));int p2 = Bdims[0];if(p2 != n)error(_("'b' (%d x %d) must be compatible with 'a' (%d x %d)"),p2, p, n, n);PROTECT(B = allocMatrix(REALSXP, n, p));SEXP Bindn = getAttrib(Bin, R_DimNamesSymbol);// This is somewhat odd, but Matrix relies on dropping NULL dimnamesif (!isNull(Adn) || !isNull(Bindn)) {// rownames(ans) = colnames(A), colnames(ans) = colnames(Bin)Bdn = allocVector(VECSXP, 2);if (!isNull(Adn)) SET_VECTOR_ELT(Bdn, 0, VECTOR_ELT(Adn, 1));if (!isNull(Bindn)) SET_VECTOR_ELT(Bdn, 1, VECTOR_ELT(Bindn, 1));if (!isNull(VECTOR_ELT(Bdn, 0)) || !isNull(VECTOR_ELT(Bdn, 1)))setAttrib(B, R_DimNamesSymbol, Bdn);}} else {p = 1;if(length(Bin) != n)error(_("'b' (%d x %d) must be compatible with 'a' (%d x %d)"),length(Bin), p, n, n); PROTECT(B = allocVector(REALSXP, n));if (!isNull(Adn)) setAttrib(B, R_NamesSymbol, VECTOR_ELT(Adn, 1));}PROTECT(Bin = coerceVector(Bin, REALSXP));Memcpy(REAL(B), REAL(Bin), (size_t)n * p);int *ipiv = (int *) R_alloc(n, sizeof(int));/* work on a copy of A */if (!isReal(A)) {A = coerceVector(A, REALSXP);avals = REAL(A);} else {avals = (double *) R_alloc((size_t)n * n, sizeof(double));Memcpy(avals, REAL(A), (size_t)n * n);}PROTECT(A);int info;F77_CALL(dgesv)(&n, &p, avals, &n, ipiv, REAL(B), &n, &info);if (info < 0)error(_("argument %d of Lapack routine %s had invalid value"),-info, "dgesv");if (info > 0)error(_("Lapack routine %s: system is exactly singular: U[%d,%d] = 0"),"dgesv", info, info);if(tol > 0) {char one[2] = "1";anorm = F77_CALL(dlange)(one, &n, &n, REAL(A), &n, (double*) NULL);work = (double *) R_alloc(4*(size_t)n, sizeof(double));F77_CALL(dgecon)(one, &n, avals, &n, &anorm, &rcond, work, ipiv, &info);if (rcond < tol)error(_("system is computationally singular: reciprocal condition number = %g"),rcond);}UNPROTECT(3); /* B, Bin, A */return B;
}
等宽矩阵(a)相乘a %*% x = b的逆运算solve(a,b)=x相关推荐
- 2016搜狗:矩阵元素相乘
题目 矩阵元素相乘 A[n,m]是一个n行m列的矩阵,a[i,j]表示A的第i行j列的元素,定义x[i,j]为A的第i行和第j列除了a[i,j]之外所有元素(共n+m-2个)的乘积,即x[i,j]=a ...
- python进行矩阵计算公式_纯python进行矩阵的相乘运算的方法示例
本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...
- 使用指针数组实现这两个矩阵的相乘
/********************************************************************* 有一2*3的整数矩阵和一3*2的整数矩阵,请使用指针数组实 ...
- 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)
矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<=100) n+1个数,表示矩阵(<=100) Output 最小的 ...
- 矩阵累积相乘 java_累积:轻松自定义Java收集器
矩阵累积相乘 java Accumulative是针对Collector<T, A, R>的中间累积类型A提出的接口Collector<T, A, R>以使定义自定义Java ...
- python矩阵乘法算法_纯python进行矩阵的相乘运算的方法示例
本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...
- Java动态规划---矩阵链相乘的最小计算代价
参考书籍:算法导论第三版. 采用自底向上的递归模式来求解. * 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示. * 主要的计算思想是递归,而且是带备忘录的递归, ...
- 以空间换时间——动态规划算法及其应用:矩阵链相乘
动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...
- 动态规划——矩阵链相乘
如果看过我上一篇文章(动态规划--最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用. 本章要讲解的问题是矩阵链相乘.因 ...
最新文章
- Asterisk cli模块分析
- 数据预处理-异常值识别
- Blockchain Patent Players and domain
- 自动化来势汹汹,未来的程序员该何去何从?
- 工厂模式(简单工厂、工厂方法、抽象工厂)
- 面向Java程序员的20大Spring REST面试问题答案
- Docker容器系列教程(三):jenkins环境搭建与插件安装
- 关于UIAlertAction如何修改sheet上的字体颜色
- python数据分析之(7)简单绘图pylab
- java新开一个线程run_创建和启动一个Java线程
- F5 BIG-IP 17.0.0
- 站长统计工具区别:百度统计、51la统计系统和cnzz数据统计工具
- St. Luke’s University Health Network是世界首批试用远程患者管理解决方案Masimo SafetyNet™来协助COVID-19住院患者的机构之一
- Java面试题-个人笔记
- 不写代码也能实现android应用
- 微信最近点赞拿东西服务器,微信朋友圈点赞说明什么?点赞的行为背后隐藏着什么含义呢?...
- php生成本地word文件怎么打开,php生成word文件的简单范例
- 华为鸿蒙系统概念图,华为Mate40Pro概念图:超高屏占比+鸿蒙系统 这才是真正的华为...
- idea左边项目栏目录结构不见了/文件夹在上面显示
- 删除的微信聊天记录如何恢复