楼主: wkn1986
16471 20

[问答] 请大家帮忙 [推广有奖]

  • 0关注
  • 4粉丝

已卖:127份资源

教授

63%

还不是VIP/贵宾

-

威望
0
论坛币
1656 个
通用积分
12.9139
学术水平
8 点
热心指数
14 点
信用等级
5 点
经验
10268 点
帖子
549
精华
0
在线时间
2400 小时
注册时间
2008-9-15
最后登录
2025-11-18

楼主
wkn1986 发表于 2012-12-26 22:08:07 |AI写论文
5论坛币
一个迭代循环过程中,要对矩阵求逆,但是经常遇到矩阵条件数很小,基本不可逆了,想判断出基本不可逆,然后跳过去,继续循环,请大家帮忙想想该怎么办?多谢啦啦

最佳答案

qoiqpwqr 查看完整内容

这样吧,用try来控制错误信息。如果solve出错的话就进入下一个循环。 这是一个简单的程序。我从0,1,2里面任选四个数字组成一个2乘以2的矩阵,然后求它的逆。这个矩阵有可能是不可逆的,用solve的话就会出错。 这个是没有try控制的语句 set.seed(1) count
关键词:不可逆 怎么办 矩阵 怎么办

沙发
qoiqpwqr 发表于 2012-12-26 22:08:08
这样吧,用try来控制错误信息。如果solve出错的话就进入下一个循环。

这是一个简单的程序。我从0,1,2里面任选四个数字组成一个2乘以2的矩阵,然后求它的逆。这个矩阵有可能是不可逆的,用solve的话就会出错。

这个是没有try控制的语句
set.seed(1)
count <- 1
inverses <- vector(mode = "list", 100)
repeat {
    x <- matrix(sample(0:2, 4, replace = T), 2, 2)
    inverses[[count]] <- solve(x)
    count <- count + 1
    if (count > 100) break
}
在第三个循环就会出错,然后就结束程序了。

然后我们加入try的控制
set.seed(1)
count <- 1
inverses <- vector(mode = "list", 100)
repeat {
    x <- matrix(sample(0:2, 4, replace = T), 2, 2)
    x.inv <- try(solve(x), silent = TRUE)
    if ('try-error' %in% class(x.inv)) next
    inverses[[count]] <- x.inv
    count <- count + 1
    if (count > 100) break
}
如果那个try语句有错误的话,下面那个if语句就会控制结束当前的循环而进入下一个循环。

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 厉害!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
wkn1986 发表于 2012-12-26 22:28:12
自己先顶了

板凳
jmpamao 发表于 2012-12-26 22:34:20
你把数据,程序发下呢, 大家也可以一起学习看看撒

报纸
qoiqpwqr 发表于 2012-12-26 22:43:08
这种数值上的问题比较难搞,比如说什么叫基本不可逆。

地板
ntsean 发表于 2012-12-27 05:41:36
先算他rank, 如果rank小于矩阵维数,那么肯定是不可逆的
已有 1 人评分热心指数 收起 理由
qoiqpwqr + 1 热心帮助其他会员

总评分: 热心指数 + 1   查看全部评分

7
qoiqpwqr 发表于 2012-12-27 08:52:05
可以看下面这个例子

> set.seed(1)
> A <- matrix(rnorm(10000), 100, 100)
> A[lower.tri(A)] <- 0
> diag(A) <- rep(0.0000001, 100)
> qr(A)$rank
[1] 99
> B <- solve(A)
Error in solve.default(A) :
  system is computationally singular: reciprocal condition number = 0

这里A是一个可逆矩阵,但是由于数值运算的原因,它的行列式det(A)很小,在R看来就成了不可逆的矩阵了。

在A的大小不是很大,A里面的元素不是很小的情况下,可以用楼上的方法,先算A的rank,如果rank小于A的行数就不是可逆的。

8
wkn1986 发表于 2012-12-27 09:29:28
自己顶啦

9
wkn1986 发表于 2012-12-27 10:10:48
Error in solve.default(t(X) %*% wl(U[j, 1], 0.9) %*% X + A) :
  system is computationally singular: reciprocal condition number = 1.60354e-16
这是运算时报错

10
trier2006 发表于 2012-12-27 12:07:36
帮顶
最好的医生是自己,最好的药物是时间……

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 11:23