Считайте матрицы как массив ячеек из длинных продольных данных Matlab

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


person N. I. ElZayat    schedule 23.11.2018    source источник
comment
Вопрос не ясен. Как выглядит оригинал (т.е. что означает несбалансированный)? В каком формате (например, текстовый файл, массив Matlab)? Что вы ожидаете на выходе? Небольшой пример с несколькими строками несбалансированного ввода и ожидаемым результатом поможет понять, чего именно вы хотите, и получить полезный ответ.   -  person Brice    schedule 23.11.2018
comment
Пожалуйста, отредактируйте вопрос, это не читается в комментарии   -  person Brice    schedule 23.11.2018
comment
@Brice, мне показалось, что это нечитаемо, поэтому я отредактировал вопрос и попытался уточнить. Желаю, чтобы это было ясно сейчас. Несбалансированный означает, что матрица каждой ячейки в Y не имеет одинакового размера. первый 5х3, второй 3х3, последний 4х3.   -  person N. I. ElZayat    schedule 23.11.2018


Ответы (1)


Я предполагаю, что входные данные содержатся в 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 при ссылке на к мнимой единице.)

person Brice    schedule 23.11.2018
comment
ваш первый код приводит к ошибке, я изменил две строки, после чего он работает, но я не могу аккуратно опубликовать код в комментарии, так как ctrl+k не определяет выбранную строку как код здесь - person N. I. ElZayat; 23.11.2018
comment
Вы можете использовать обратные кавычки ` вокруг фрагментов кода в комментариях. Точно так же вы вставляете код в вопросы и ответы. - person Brice; 23.11.2018
comment
Модифицированный код //N=max(i1); Y = cell(1,N); for kk=1:N sel = (i1==kk); Y{kk} = [y1(sel),y2(sel),y3(sel)]; end// не могу найти как ввести новую строку в комментарии?? - person N. I. ElZayat; 23.11.2018
comment
Я понял. Что касается запуска кода в моем последнем комментарии к полному набору данных, мне нужно добавить еще одну командную строку в цикл, чтобы избавиться от векторов NAN для несбалансированных субъектов, окончательный код, который отлично работает с моими полными данными, это N=max(i1); Y = cell(1,N); for kk=1:N sel = (i1==kk); yy = [y1(sel),y2(sel),y3(sel)]; yy(any(isnan(yy), 2), :) = []; Y{kk} = yy; end - person N. I. ElZayat; 23.11.2018