我有一个大的数据集(向量(,我想将其拆分为n个较小的集,以便稍后与其他脚本一起查看。I.e.if n=10 I want turn one 1x80000000 double in to ten 1x8000000 double。我的想法是把原来的矩阵变成一个n乘m的矩阵,然后把矩阵的每一行保存到它自己的向量中,如下所示。
%data-n-splitter
n = 10 %number of sections
L = length(data);
Ls = L/n;
Ls = floor(Ls);
Counter = 1;
%converting vector to matrix
datamatrix = zeros(n,Ls);
for k = 1:n
datamatrix(k,:) = data(Counter:Counter+ Ls - 1);
Counter = Counter + Ls;
end
我如何使matlab循环这部分代码n次:
%save each row of matrix as seperate vector
P1 = datamatrix(1,:);
P2 = datamatrix(2,:);
P3 = datamatrix(3,:);
P4 = datamatrix(4,:);
P5 = datamatrix(5,:);
P6 = datamatrix(6,:);
P7 = datamatrix(7,:);
P8 = datamatrix(8,:);
P9 = datamatrix(9,:);
P10 = datamatrix(10,:);
我希望得到的答案示例:
for k = 1:n
P('n') = datamatrix(n,:);
end
我看过一些关于使用单元数组的文章,但我将变量传递给的脚本并没有为此设置,所以如果可能的话,我宁愿不走这条路。
有几个选项:
- 使用
struct
,它最接近您的期望 - 使用CCD_ 2、更方便的循环但不能访问有意义的名称
- 使用更高维度的矩阵(在您的情况下,它只是2D,但3D或更高版本也是如此(。这是内存效率最高的选项
- 为了实现这一点,您还可以使用
table
,它是struct
和cell
的混合,因为您可以同时使用这两种符号来访问它。没有其他好处
现在,如何做到这一点?首先是最简单(也是最好(的解决方案:使用reshape
创建2D矩阵
Ary = 1:10; % I shrank your 1x80000000 array to 1x10 but you'll get the idea
%% create new structure
Mat = reshape(Ary,5,2);
%% access new structure (looping over columns)
for i = 1:size(Ary,2)
% access columns through slicing
ary_sct = Mat(:,i);
% do something
end
Pro:内存高效(需要与初始数组相同的内存量(;容易循环
Con:只有当您能够均匀地对初始阵列进行切片时才有效
下一个:创建一个单元格
Ary = 1:10;
n = 2; % number of sections
L = floor(length(Ary)/n);
% allocate memory
C = cell(1,n);
%% create new structure
for i = 1:n
% access the content of a cell with {}
C{i} = Ary((i-1)*L+1:i*L);
end
%% access new structure (looping over entries)
for i = 1:length(C)
% access the content of a cell with {}
ary_sct = C{i};
% do something
end
Pro:您可以在单元格中存储任何内容。每种数据类型——通常更重要的是——任何维度的
Con:如果你是初学者,访问内容(通过{}
(或访问元素(通过()
(有点烦人;每个元素需要大约60字节的内存开销,因为这些是指针,需要存储它们指向的位置和内容的信息。
下一个:使用结构
Ary = 1:10;
n = 2; % number of sections
L = floor(length(Ary)/n);
% create empty struct
S = struct();
%% create new structure
for i = 1:n
% create fieldname (must start with a character!)
fld = num2str(i,'F%d');
% write to field (note the brackets)
S.(fld) = Ary((i-1)*L+1:i*L);
end
%% access new structure (looping over fieldnames)
% get all field names
FlNms = fieldnames(S);
for i = 1:length(FldNames)
% access field names (this is a cell!)
fld = FldNms{i};
% access struct
ary_sct = S.(fld);
% do something
end
Pro:字段名称便于保存数据的概述
Con:在循环中访问字段名有点乏味;每个元素需要大约60字节的内存开销,因为这些是指针,需要存储它们指向的位置和内容的信息。