如何在单元格数组中拆分矩阵

时间:2013-07-11 19:07:12

标签: matlab memory for-loop

我有< 1 x 29>细胞阵列。在每个单元内,有一个< 310x2000双>矩阵。由于存储器问题,我想将这些矩阵分解为较小的“块”(假设每个约5 x 2000),从第4行开始到第309行结束。

因此,我的数据以data{i}(j,:)格式存储,其中i表示单元格编号,j表示所需的行。

我创建了一个矩阵(我们称之为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以获取选项。

1 个答案:

答案 0 :(得分:0)

首先,你得到的错误是如何从数组中取出循环索引的结果。在第三个嵌套循环中,您将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的匿名函数语法(@部分)来创建一个函数,该函数接收矩阵并使用给定范围对其进行切片。你可以在自己的m文件中使splitcell成为普通函数,我在这里使用@来获得紧凑性。 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