版权声明:本文为博主原创文章,如能帮助到各位,荣幸之至,欢迎转载。 https://blog.csdn.net/m0_37639589/article/details/79690375
matlab 中由于占用 close 引起的异常错误
什么是 close
在 matlab 中 close 就是一个移除特定图像句柄的函数,其解释是:
Remove specified figure
问题展示
不就是一个函数是吧?那能引起什么问题呢?顶多就是我们对占用了函数名,导致这个函数不可用罢了。
之前,我也是这样认为的,然而最近却发现,还真不止于此。也正是这些莫名其妙的错误,让我对 matlab
有了深深的厌恶感,我是个严谨的人,可不希望这些基本的问题上犯错。
你可以从这里获取下面所需的数据, 密码:p1yz
所需代码有两部分:
第一部分是加载数据,及调用函数计算的脚本。
clear
close all
clc
%% 将数据载入内存空间
load data
index = calc(close,rm,rf,w);
第二部分就是所调用的计算函数:
function index = calc(price,rm,rf,w)
%% 计算股票收益率序列
r = price2ret(price);
rm = price2ret(rm);
%% capm模型的估计
% 计算组合的股票个数
n = length(w);
% 建立元胞,用于存储回归模型
rsquare = nan(n,1);
%% 回归估计capm模型
for i = 1:n
% 利用fitlm函数进行回归,估计出模型
md = fitlm(rm-rf,r(:,i)-rf);
% 将模型的r方进行存储
rsquare(i) = md.Rsquared.Adjusted;
end
%% 将求得的r当进行加权,即可得出结果
index = sum(w .* rsquare);
end
现在演示错误。如果,直接运行脚本会返回这样的错误:
返回去看 calc.m 的内存:
这个 price 只有一个值一,这是不符合数据情况的。
因为 base 空间中是这样的:
因此我怀疑是用 close all
这句话导致了异常,因此在脚本中将那句代码注释,结果正常运行:
反思与分析
要注意单纯清楚变量是解决不了问题的,比如脚本写这样还是出错:
clear
close all
clear
clc
%% 将数据载入内存空间
load data
index = calc(close,rm,rf,w);
我一开始以为是占用 close 的缘故,所以又建立了一个数据文件,将 close 这个变量替换。即有以下
脚本:
clear
close all
clc
%% 将数据载入内存空间
% load data
% price = close;
% save('mydata','price','rm','rf','w');
load mydata
index = calc(price,rm,rf,w);
还有后面那个 clear 再加上 all classes 之类的参数,也是一样,这才是我真正火恼的原因。因为
这个错误的 close 什么都不是。
结果正常运行。所以说问题是出在了传递变量 close 时,如果之前有用 close all
这句话,会产生
一个 close 的值,而且不能被重新赋值,或者说在函数传递是这个值存在为1且不能被赋值。这应当属于
matlab 的一个 bug。非常可笑,希望大家以后谨慎。