我对 Matlab 还很陌生,我正在努力弄清楚如何正确预处理我的数据,以便用它进行一些计算。
我有一个 Excel 表格,其中包含许多公司的财务日志报表,其中每一行都是一天,每一列都是一家公司:
我将所有内容正确导入到 Matlab 中,如下所示:
现在我必须创建所谓的“滚动窗口”。为此,我使用以下代码:
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
好吧,如果我为返回的第一列运行此代码,则一切正常...但我的目标是为日志返回的每一列生成相同的内容。所以基本上我必须添加第二个 for 循环...但我不知道的是我需要使用哪种语法才能使“.SYS”动态化并基于包含公司名称的字符串单元格数组,以便...
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 [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 考虑预分配”...我该如何执行此操作?
最佳答案
你就快到了。通过为字段构建字符串来使用动态字段名称。您的字段位于名为 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/ ...但基本上,如果您有一个字符串并且您想使用该字符串创建一个字段,您可以这样做:
str = '...';
s.(str) = ...;
s
是您的结构,str
是您要命名字段的字符串。
关于excel - Matlab 数据预处理和动态结构分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33705267/