2016-12-01 4 views
0

Matlabのネストされたセル配列の順序を逆転することが可能かどうかを知りたいと思います。Matlabのネストされたセル配列の逆順

私はセルアレイ A{a,b}{c,d} B{c,d}{a,b} に変換する方法があるにしている場合?

C={c,d}(a,b) をまとめてaと後でbとすることを目的としています。

私は C=cellfun(@cell2mat, A, 'UniformOutput', false); を行う場合、Cはさらに私を助けていない形状C{a,b}(c,d)を、持っています。

私はどんなヘルプ、ヒントやコメントをいただきありがとうございます。

アンナ

答えて

0

あなたA varaibleがA{a,b}{c,d}レベルの数字またはそれ以上のネストされた細胞を持っていますが、我々は、細胞内の単一の数字を前提とした場合、あなたが2つの短い段階でこれを作ることができれば、本当にわからない

  1. は再手配順

でみましょう最初のいくつかのテストデータを作成し、それを構築し

  • あなたのセルを平らに。コード検証を容易にするために、それぞれの値は、元の位置/インデックスに関する情報(パターン:ab.cd)によって構築されます。たとえば、A{1,4}{2,3}には、値14.23が与えられます。

    % Index size 
    a = 5; 
    b = 4; 
    c = 3; 
    d = 2; 
    
    % Cell values 
    [ai, bi] = ind2sub([a b], 1:a*b); 
    abVal = 10*ai + bi; 
    [ci,di] = ndgrid(1:c,1:d); 
    cdVal = ci/10+di/100; 
    
    % Built up A 
    A = cell(a,b); 
    for i = 1:numel(A) 
        A{i} = num2cell(abVal(i) + cdVal); 
    end 
    

    num2cellは本当にここに必要ではありませんが、もっと自分のデータを模倣することがあります。番号(セルではない)またはより深くネストされたセルがある場合は、下の最後の行に中括弧{:}の代わりにかっこ(:)を使用する必要があります。しかし、この例では以下のことが行われます。

    % Flatten the 2-level nested cell (could use vercat instead of horcat) 
    A_flat = horzcat(A{:}); 
    A_flat = horzcat(A_flat{:}); % Could also use [A_flat{:}] here 
    

    今値が偶数インデックスの距離に配置され、エヴェーレc x b値を選択しているという事実を使用します。ここで

    % Built up re-arrange cell 
    A_reOrdered = cell(c,d); 
    for i = 1:c*d 
        A_reOrdered{i} = reshape(A_flat(i:c*d:end), a, b); 
    end 
    

    、私は実際にA{c,d}(a,b)A{a,b}{c,d}から変換しています。あなたはA{c,d}{a,b}すなわち下部のセル構造をしたい場合は、単にいくつかの例forループ

    reshapenum2cellを置くことvalus:もともと

    >> A{5,2}{3,1} 
    ans = 
         52.31 
    
    に置いた

    >> A_reOrdered{3,1} 
    ans = 
         11.31  12.31  13.31  14.31 
         21.31  22.31  23.31  24.31 
         31.31  32.31  33.31  34.31 
         41.31  42.31  43.31  44.31 
         51.31  52.31  53.31  54.31 
    
    >> A_reOrdered{3,1}(5,2) 
    ans = 
         52.31 
    


    しかし、目標が実際にはいくつかの合計を計算することだった場合は、平坦化ステップの後に停止し、そのデータを直接。 A_flatのパターンを調べてみてください。特定 'B'

    nB = a*c*d; 
    for ib = 1:b 
        bSum(ib) = sum(A_flat((ib-1)*nB + (1:nB))); 
    end 
    
    % ... or without the for-loop 
    bSum = arrayfun(@(x) sum(A_flat(x + (1:nB))), nB*(0:b-1)); 
    
    bSum = 
         936.45  966.45  996.45  1026.5 
    
    のすべての値を合計する。例えば