solve用来逆运算矩阵相乘.
例如
a %*% x = b的逆运算, solve(a,b) = x
这里必须注意, a必须是等宽矩阵, 如果不等宽, 会报错. 例如 :

> 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
除此之外, 还有可能因为其他报错, 但实际上是可以逆向解的.  (可能是我对可逆的理解有问题, 以后再来处理这个问题)
错误代码见
src/modules/lapack/Lapack.c
   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的, 但是报错了.
好了接下来看几个可以计算的例子 : 
> 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

[参考]

1. help("solve")
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. 
src/modules/lapack/Lapack.c
/* 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相关推荐

  1. 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 ...

  2. python进行矩阵计算公式_纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...

  3. 使用指针数组实现这两个矩阵的相乘

    /********************************************************************* 有一2*3的整数矩阵和一3*2的整数矩阵,请使用指针数组实 ...

  4. 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

    矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<=100) n+1个数,表示矩阵(<=100) Output 最小的 ...

  5. 矩阵累积相乘 java_累积:轻松自定义Java收集器

    矩阵累积相乘 java Accumulative是针对Collector<T, A, R>的中间累积类型A提出的接口Collector<T, A, R>以使定义自定义Java ...

  6. python矩阵乘法算法_纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...

  7. Java动态规划---矩阵链相乘的最小计算代价

    参考书籍:算法导论第三版. 采用自底向上的递归模式来求解. * 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示. * 主要的计算思想是递归,而且是带备忘录的递归, ...

  8. 以空间换时间——动态规划算法及其应用:矩阵链相乘

    动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...

  9. 动态规划——矩阵链相乘

    如果看过我上一篇文章(动态规划--最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用. 本章要讲解的问题是矩阵链相乘.因 ...

最新文章

  1. Asterisk cli模块分析
  2. 数据预处理-异常值识别
  3. Blockchain Patent Players and domain
  4. 自动化来势汹汹,未来的程序员该何去何从?
  5. 工厂模式(简单工厂、工厂方法、抽象工厂)
  6. 面向Java程序员的20大Spring REST面试问题答案
  7. Docker容器系列教程(三):jenkins环境搭建与插件安装
  8. 关于UIAlertAction如何修改sheet上的字体颜色
  9. python数据分析之(7)简单绘图pylab
  10. java新开一个线程run_创建和启动一个Java线程
  11. F5 BIG-IP 17.0.0
  12. 站长统计工具区别:百度统计、51la统计系统和cnzz数据统计工具
  13. St. Luke’s University Health Network是世界首批试用远程患者管理解决方案Masimo SafetyNet™来协助COVID-19住院患者的机构之一
  14. Java面试题-个人笔记
  15. 不写代码也能实现android应用
  16. 微信最近点赞拿东西服务器,微信朋友圈点赞说明什么?点赞的行为背后隐藏着什么含义呢?...
  17. php生成本地word文件怎么打开,php生成word文件的简单范例
  18. 华为鸿蒙系统概念图,华为Mate40Pro概念图:超高屏占比+鸿蒙系统 这才是真正的华为...
  19. idea左边项目栏目录结构不见了/文件夹在上面显示
  20. 删除的微信聊天记录如何恢复

热门文章

  1. Android组件化打造知乎日报系列(一)—— 项目架构搭建
  2. 在 libevent 中使用 MariaDB(MySQL)
  3. Linux内核同步:RCU
  4. 无界阻塞队列 LinkedBlockingQueue 原理探究
  5. 树莓派迅雷远程下载 | 树莓派小无相系列
  6. Activity中KeyEvent的传递
  7. Solaris 上swap -s的解释
  8. C语言中的itoa和atoi函数的实现
  9. Windows Azure ISV博客系列:ReedRex 的sociobridge
  10. php 不可以连接远程mysql数据库