我有< 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以获取选项。
答案 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