将Matlab中的值增加到第二个值(1:n逻辑)

时间:2012-05-16 22:47:23

标签: matlab matrix increment

我在Matlab中有2年的专栏,如下所示:

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

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

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

我无法使用'for'循环,因为数据量非常大,而且我没有成功使用accumarray。矢量化解决方案将受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

这可以满足您的需求:

n = size(mat, 1);
c = arrayfun(@(x) {mat(x, 1):mat(x, 2)}, 1:n);
FinalAns = [c{:}];

答案 1 :(得分: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

答案 2 :(得分: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,您应该从矢量化解决方案中获得大部分收益。