0

我有一个 <1 x 29> 单元阵列。每个单元格内都有一个 <310x2000 double> 矩阵。由于内存问题,我想将这些矩阵分解成更小的“块”(假设每个大约 5 x 2000),从第 4 行开始,到第 309 行结束。

因此,我的数据以data{i}(j,:)wherei表示单元格编号的格式存储,并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 作为您的选项。

4

1 回答 1

0

首先,您得到的错误是如何从数组中取出 for 循环索引的结果。在第三个嵌套循环中,您将设置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 回答