我在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
。矢量化解决方案将受到高度赞赏。
答案 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
,您应该从矢量化解决方案中获得大部分收益。