2015-11-14 30 views
2

我对Matlab很新颖,我很努力想弄清楚如何正确预处理我的数据以便对它进行一些计算。Matlab数据预处理和动态结构赋值

我有一个Excel表,这样许多公司的财务数收益,每行是一天,每列是一个公司:

enter image description here

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

enter image description here

现在我要创建什么是caled“滚动窗口”。要做到这一点,我使用下面的代码:

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”动态化,并基于包含公司名称的字符串单元格数组,以便...

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似乎在每个循环改变大小迭代唧唧歪歪考虑预分配” .. 。我该怎么做?

回答

2

你快到了。通过为字段构建字符串来使用动态字段名称。你们的田地,在单元阵列称为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的一个伟大的文章,如果您想了解更多:http://blogs.mathworks.com/loren/2005/12/13/use-dynamic-field-references/ ......但基本上,如果你有一个字符串,你想使用这个字符串创建一个字段,你会怎么做:

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

s是你的结构和str是你希望把你的字段中的字符串。

+0

谢谢队友!我只是用一个工作函数编辑我的问题!我如何预先分配ROLLING_WINDOWS变量? –

+0

@Zarathos np。试试现在的老板。 – rayryeng