matlab捕获奇异值警告(函数lastwarn, warning)

实际问题:

警告:矩阵接近奇异值,或者缩放错误。结果可能不正确。

实验中遇到奇异值警告时,想要捕获该警告,跳出该层循环不再执行后续程序,并且在结果中记录警告

解决方法:

matlab官方文档其实给出了一些关于错误的处理方式
在这里插入图片描述
但是由于我这里想要捕获的警告不是自己定义的,而是在计算过程中系统自己发出来的,所以我采取了比较综合的方式:

  1. 选取函数lastwarn(官方文档)捕获最后一条警告信息(注意:这里说的最后一条警告信息是全局的,假设代码中设置每一次循环都用lastwarn去捕获警告信息,若某一个参数设置下出现了警告A,使用lastwarn捕获A,但是在下一个参数设置中即便程序本身没有错误,但是lastwarn仍然会捕获到A;亦或是程序本身就不会出现警告,但是lastwarn还可以捕获在程序运行之前出现的警告信息)
  2. 利用函数warning(官方文档)在循环前面输出一个事先定义的不相关的警告
  3. 将lastwarn捕获到的信息与事先定义的信息进行比较(也可以通过其他方式进行比较),如果长度不一致则跳出循环(根据实际需要决定需要跳出几层循环),反之代表没有警告出现,继续进行实验

示意代码:

for i=1:10
	for j=1:10
	warning('off');%不在命令行显示警告信息
	msg=char('Message 1.');%自定义警告信息
	warning('Message 1.');%输出自定义警告信息
	error=0;%每次确定参数后,error归0
	
	***
	(主要代码)
	***
	
	[msg1, warnID]=lastwarn;%捕获最新一条警告信息
	if length(msg1)~=length(msg) %判断最新一条警告信息是否和自定义的警告信息一致
		error=1; %如果两条警告信息不一致,说明出现了新的警告,error置1并跳出循环
		break
	else 
	end
	
	end
	%将结果记录在txt中
	if error==1
	fp=fopen('results.txt','a+');
	fprintf(fp,'i:%d, j:%d, warnID:%s, msg1:%s\n', i, j, warnID, msg1);
	fclose(fp);
	else 
	fp=fopen('results.txt','a+');
	fprintf(fp,'i:%d, j:%d, results:%f\n', results);
	fclose(fp);
	end

为了方便处理结果(避免电脑自动更新或停电带来的沉痛教训),我选择将结果直接保存至txt文件中,如果有更好的方法欢迎大家指点~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab奇异值分解函数是svd。根据文献引用,svd函数的使用格式有以下几种: 1. 对于矩阵X,使用格式s = svd(X)可以返回矩阵X的奇异值向量。 2. 使用格式[U,S,V] = svd(X),可以返回一个与X大小相同的对角矩阵S,以及两个酉矩阵U和V,满足X = USV'。如果矩阵A大小为m×n,则U为m×m阵,V为n×n阵。奇异值在S的对角线上,非负且按降序排列。 3. 使用格式[U,S,V] = svd(X,0),可以得到一个“有效大小”的分解,只计算出矩阵U的前n列,矩阵S的大小为n×n。此时,如果X为m×n矩阵且m >= n,则这种分解等价于svd(X,0)。如果m < n,则只计算V的前m列,S的大小为m×m。 4. 使用格式[U,S,V] = svd(X,'econ'),可以得到一个“经济尺寸”的分解。如果X为m×n且m >= n,则等价于svd(X,0)。如果m < n,则只计算V的前m列,S的大小为m×m。 综上所述,Matlab中的奇异值分解函数svd可以根据需要返回不同形式的分解结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [奇异值分解——matlab中svd函数用法总结](https://blog.csdn.net/weixin_44567900/article/details/108831329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [matlab函数svd是什么意思](https://blog.csdn.net/m0_37665485/article/details/102600297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值