从较长的纵向Matlab数据中将矩阵读取为单元阵列

时间:2018-11-23 06:19:08

标签: matlab cell-array matrix-indexing

假设以下假设的Matlab数据(作为列向量):对于3个受试者(i = 1至3),每个受试者在5个时间点(j = 1至5)或更短的时间内(不平衡)提供三个测量值y1,y2,y3 )。原始数据集更大。所以我需要使用细胞阵列。最后,我需要Y = cell(3,1),这样,对于主题i,Y {i}是一个矩阵,表示针对主题i的重复测量。

GL_TEXTURE_EXTERNAL_OES

所以我需要它们看起来像

i   j   y1  y2  y3

1   1   1.0 0.6 0.8
1   2   0.8 0.7 0.2
1   3   1.0 0.7 0.9
1   4   1.0 0.8 0.7
1   5   0.7 0.8 0.9

2   1   0.5 0.7 0.8
2   2   0.4 0.7 0.6
2   3   0.4 0.5 0.8

3   1   0.4 0.5 0.7
3   2   0.5 0.6 0.8
3   3   0.5 0.6 0.8
3   4   0.6 0.6 0.8

我还需要使用i和j来帮助建立索引

1 个答案:

答案 0 :(得分:0)

我假设输入数据包含在5个向量中,分别称为ijy1y2y3。您可以使用以下代码:

% Initialize Y
Y = cell(max(i),1);

% Loop to read
for kk=1:max(i)
    sel = (i==kk); % Logical array use to select lines according to i
    ind = j(sel);  % This is in case the input data is not sorted, we'll know where the data has to go in Y{...}
    % Start with last column so that Y{ii} is initialized with the good size
    Y{kk}(ind,3) = y3(sel);
    Y{kk}(ind,2) = y2(sel);
    Y{kk}(ind,1) = y1(sel);
end

如果所有数据均已按ij排序,则可以使用mat2cell。仍然需要循环来了解每个i值的行数:

% Initialize Y
count = zeros(max(i),1);

% Loop to count
for kk=1:max(i)
    count(kk)=(i==kk);
end
Y = mat2cell([y1,y2,y3] , count);

(请注意,不建议将ij用作变量名,因为这可能导致与虚构单位i混淆,并可能影响性能。 Mathworks建议使用其他变量名,并在引用虚数单元时使用1i1j