3

我在 Matlab 中有一个 2 年的列,如下所示:

             % Col2 Is always greater than Col1
mat  = [2009 2012 ;
        2012 2012 ;
        2012 2013 ;

我需要为第 1 行执行 2009:2012,为第 2 行执行 2012:2012,依此类推......这并不容易,因为每对的大小 1:N 都在不断变化。

FinalAns = [    2009
                2010
                2011
                2012           % -- 
                2012           % -- 
                2012
                2013      ] ;  % -- 

我不能使用“for”循环,因为数据量非常大,而且我没有成功使用accumarray它。将高度赞赏矢量化解决方案。

4

3 回答 3

2

这可以满足您的需要:

n = size(mat, 1);
c = arrayfun(@(x) {mat(x, 1):mat(x, 2)}, 1:n);
FinalAns = [c{:}];
于 2012-05-16T23:03:27.623 回答
2

您可以轻松地使用 arrayfun 生成单元矩阵,如下所示:

>> Cells = arrayfun(@(a, b) {a:b}, Col1, Col2);
>> Cells{1}

ans =

        2009        2010        2011        2012

>> Cells{2}

ans =

        2012

>> Cells{3}

ans =

        2012        2013

您可能会发现单元矩阵比您最初要求的形式更方便,但如果不是,这里是如何转换它:

>> horzcat(Cells{:})

ans =

        2009        2010        2011        2012        2012        2012        2013
于 2012-05-16T23:11:25.003 回答
1

这将起作用:

Col1 = [ 2009  ; 2012 ; 2012 ] ;
Col2 = [ 2012  ; 2012 ; 2013 ] ;

finalAnswer = zeros(sum(Col2 - Col1) + length(Col1),1);

curr=0;
for iter = 1:length(Col1)
    finalAnswer((curr+1):(curr + Col2(iter)-Col1(iter)+1)) = Col1(iter):Col2(iter);
    curr = curr + Col2(iter)-Col1(iter)+1;
end

仍然有 for 循环,但是通过finalAnswer如上所述的预分配,您应该从矢量化解决方案中获得您期望的大部分收益。

于 2012-05-16T23:06:22.690 回答