【问题标题】:Loop matrices into a structure将矩阵循环到结构中
【发布时间】:2013-12-05 06:26:09
【问题描述】:

我什至不确定标题是否描述了我想做什么,所以让我试着详细说明一下。

循环的每次迭代都会创建一个X 矩阵。就目前而言,只有X 矩阵的最后一次迭代在循环结束后仍然存在。 但是我想要的最终输出是 6 个X 矩阵。每个循环迭代一个。

基本上,我想保存所有 6 个 X 矩阵,而不是在每次迭代后覆盖它们。

for col=2:7
    logprice=log(ret(1:end,col));
    logret=diff(logprice);
    exret=logret-logRFree;
    price_mat(:,col-1)=logprice; 
    ret_mat(:,col-1)=logret;
    exret_mat(:,col-1)=exret;

    X=[ret_mat(:,col-1) termspread creditspread inflation realrate ];   

end

【问题讨论】:

    标签: matlab loops structure


    【解决方案1】:

    如果X 的大小在每次迭代中都不同(看起来就是这样),将它们存储在元胞数组中可能是最简单的:

    % before loop
    X = cell(N,1);
    % in loop, with a counter ii ...
    X{ii} = [...];
    

    如果 X 矩阵在循环的每次迭代中大小相同,您可以预先分配一个 3D 数组并保存到每个切片(例如 X=zeros(R,C,P); ... X(:,:,ii) = [...];);

    【讨论】:

      【解决方案2】:

      有两种最常见的方法。 Cell arrays 就是其中之一。另一种是 3-D 矩阵。它也可以推广到 n-D 矩阵。

      元胞数组可以在每次迭代中处理不同大小的矩阵 X。 3-D 矩阵不能。所有矩阵必须具有相同的大小。您可以预先分配单元以及 3-D 矩阵,以节省大型循环的执行时间。此外,这是一个很好的做法。

      1. Preallocate cell array
      2. Preallocate matrix

      可以这样做:

      count=0;
      for col=2:7
          count=count+1;
          logprice=log(ret(1:end,col));
          logret=diff(logprice);
          exret=logret-logRFree;
          price_mat(:,col-1)=logprice; 
          ret_mat(:,col-1)=logret;
          exret_mat(:,col-1)=exret;
      
          %%%%%%Execute only one of the following two statements%%%%%%%
          X{count}=[ret_mat(:,col-1) termspread creditspread inflation realrate ];   
          X(:,:,count)=[ret_mat(:,col-1) termspread creditspread inflation realrate ];
          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      end
      

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        相关资源
        最近更新 更多