matlab 中由于占用 close 所引起的异常错误

版权声明:本文为博主原创文章,如能帮助到各位,荣幸之至,欢迎转载。 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

现在演示错误。如果,直接运行脚本会返回这样的错误:

2018-03-25-20-21-43
返回去看 calc.m 的内存:
2018-03-25-20-24-57
这个 price 只有一个值一,这是不符合数据情况的。

因为 base 空间中是这样的:
2018-03-25-20-26-14

因此我怀疑是用 close all 这句话导致了异常,因此在脚本中将那句代码注释,结果正常运行:
2018-03-25-20-27-53

反思与分析

要注意单纯清楚变量是解决不了问题的,比如脚本写这样还是出错:

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。非常可笑,希望大家以后谨慎。

猜你喜欢

转载自blog.csdn.net/m0_37639589/article/details/79690375