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 に答える