Matlab数据预处理和dynamic结构分配

对于Matlab来说,我很新,而且我正在努力弄清楚如何正确地预处理我的数据,以便对它进行一些计算。

我有许多公司的财务日志回报Excel表格,每一行是一天,每一列是公司:

在这里输入图像说明

我正确地导入一切到Matlab像这样:

在这里输入图像说明

现在我必须创build什么是“滚动窗口”。 为此,我使用下面的代码:

function [ROLLING_WINDOWS] = setup_returns(RETURNS) bandwidth = 262; [rows, columns] = size(RETURNS); limit_rows = rows - bandwidth; for i = 1:limit_rows ROLLING_WINDOWS(i).SYS = RETURNS(i:bandwidth+i-1,1); end end 

那么如果我运行这个代码的第一列返回一切工作正常…但我的目标是为每一个日志返回列产生相同的东西。 所以基本上我必须添加第二个循环…但是我没有得到的是我需要使用哪种语法来使“.SYS”dynamic化,并基于包含公司名称的string单元格数组,以便…

 ROLLING_WINDOWS(i)."S&P 500" = RETURNS(i:bandwidth+i-1,1); ROLLING_WINDOWS(i)."AIG" = RETURNS(i:bandwidth+i-1,2); and so on... 

谢谢你们的帮助!

编辑:工作function

 function [ROLLING_WINDOWS] = setup_returns(COMPANIES, RETURNS) bandwidth = 262; [rows, columns] = size(RETURNS); limit_rows = rows - bandwidth; for i = 1:limit_rows offset = bandwidth + i - 1; for j = 1:columns ROLLING_WINDOWS(i).(COMPANIES{j}) = RETURNS(i:offset, j); end end end 

确定一切都是完美的…只是一个问题… matlab intellissense告诉我“ROLLING_WINDOWS似乎改变大小的每一个循环迭代bla bla bla考虑preallocating”…我怎么能执行这个?

你快到了。 通过为字段构buildstring来使用dynamic字段名称。 你的领域是在一个单元arrays称为COMPANIES ,所以:

 function [ROLLING_WINDOWS] = setup_returns(COMPANIES, RETURNS) bandwidth = 262; [rows, columns] = size(RETURNS); limit_rows = rows - bandwidth; %// Preallocate to remove warnings ROLLING_WINDOWS = repmat(struct(), limit_rows, 1); for i = 1:limit_rows offset = bandwidth + i - 1; for j = 1:columns %// Dynamic field name referencing ROLLING_WINDOWS(i).(COMPANIES{j}) = RETURNS(i:offset, j); end end end 

这里有来自MathWorks的Loren Shure的一篇很棒的文章,如果你想了解更多: http : //blogs.mathworks.com/loren/2005/12/13/use-dynamic-field-references/ …但基本上,如果你有一个string,你想用这个string来创build一个字段,你会这样做:

 str = '...'; s.(str) = ...; 

s是你的结构, str是你想要命名的string。