Считывание матриц как массива ячеек из данных продольного matlab - PullRequest
0 голосов
/ 23 ноября 2018

Предположим, что следующие гипотетические данные Matlab (как векторы столбцов): для 3 субъектов (i = от 1 до 3) каждый обеспечивает три измерения y1, y2, y3, в течение 5 временных точек (j = от 1 до 5) или меньше (несбалансированный).Исходный набор данных больше.поэтому мне нужно использовать массив ячеек.В конце мне нужно иметь Y = ячейка (3,1), так что для субъекта i Y {i} - это матрица, представляющая повторные измерения для субъекта i.

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

Поэтому мне нужно, чтобы они выглядели как

Y{1}=       
1.0 0.6 0.8
0.8 0.7 0.2
1.0 0.7 0.9
1.0 0.8 0.7
0.7 0.8 0.9

Y{2}=       
0.5 0.7 0.8
0.4 0.7 0.6
0.4 0.5 0.8

Y{3}=       
0.4 0.5 0.7
0.5 0.6 0.8
0.5 0.6 0.8
0.6 0.6 0.8

Мне также нужно использовать i и j, чтобы помочь в индексации

1 Ответ

0 голосов
/ 23 ноября 2018

Я предполагаю, что входные данные содержатся в 5 векторах, называемых i, j, y1, y2 и y3.Вы можете использовать следующий код:

% 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

Если все данные уже отсортированы по i & j, вы можете использовать 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);

, все равно потребуется цикл (примечание: использование i и j в качестве имен переменных нерекомендуется, так как это может привести к путанице с мнимой единицей i и может повлиять на производительность. Mathworks рекомендует использовать другие имена переменных и использовать 1i или 1j при обращении к мнимой единице.)

...