0

<1 x 29> セル配列があります。各セル内には <310x2000 double> マトリックスがあります。メモリの問題のため、これらの行列を行 4 から行 309 で終わる小さな「チャンク」(それぞれ約 5 x 2000 としましょう) に分割したいと思います。

したがって、私のデータは、セル番号を参照するdata{i}(j,:)場所の形式で保存され、目的の行を参照します。ij

各列が各「チャンク」に必要な行の値を提供するマトリックス(Aと呼びましょう)を作成しました

4   10  15  20  25
5   11  16  21  26
6   12  17  22  27 ...
7   13  18  23  28
8   14  19  24  29

たとえば、行列 1 には行 4、5、6、7、および 8 が含まれます。

nCells は私が持っているセルの数 (29) を指し、nCol は行列 A の列の数を指します。したがって、

for i = 1:nCells
    for k = 1:nCol
        for j = A(:,k)
           B{i,k}(j,:) = [data{i}(j,:)];
        end
    end
end

残念ながら、これにより次のエラーが発生します。

??? ==> horzcat CAT 引数の使用時のエラー 次元が一貫していません。

メモリの問題が発生したため、誰かが問題の内容を教えてくれたり、/特にこれを行うためのより良い方法がある場合は、本当に感謝しています:

??? メモリ不足です。オプションに HELP MEMORY と入力します。

4

1 に答える 1

0

まず、取得しているエラーは、 for ループ インデックスが配列から取り出された結果です。3 番目のネストされたループではj、列ベクトルに設定しています。これを に置き換えればA(:,k)'、おそらくうまくいくでしょう。次のデモを参照してください。

>> for i=([1;2;3;4]), disp(['i=' int2str(i)]); end;
??? Error using ==> horzcat
CAT arguments dimensions are not consistent.


>> for i=([1,2,3,4]), disp(['i=' int2str(i)]); end;
i=1
i=2
i=3
i=4

第二に、これを別の方法で行うことができます。私の最初の本能は、次のような関数を作成することです。

>> splitcell = @(C,range)(cellfun( @(X)(X(range,:)), C, 'UniformOutput', false) )

これは、優れたcellfunコマンドを使用して、セル配列の各要素に対して関数を呼び出します。ここでは、matlab の無名関数構文 (その@部分) を使用して、行列を受け取り、それを特定の範囲でスライスする関数を作成しています。splitcell独自の m ファイルで通常の関数を作成できます@。コンパクトにするためにここで使用しました。splitcell次の使用法があります。

>> data = cell(1,5);
>> X = [1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16]

X =

 1     2     3     4
 5     6     7     8
 9    10    11    12
13    14    15    16

>> for i=1:5, data{i} = (X+i*ones(4)); end;
>> data{1:2}

ans =

 2     3     4     5
 6     7     8     9
10    11    12    13
14    15    16    17


ans =

 3     4     5     6
 7     8     9    10
11    12    13    14
15    16    17    18

>> data2 = splitcell(data,3:4)

data2 = 

[2x4 double]    [2x4 double]    [2x4 double]    [2x4 double]    [2x4 double]

>> data2{1:2}

ans =

10    11    12    13
14    15    16    17


ans =

11    12    13    14
15    16    17    18
于 2013-07-11T19:43:59.063 に答える