MATLAB: Как я могу добавить значения NaN в массив, где данные не существуют на основе индексов строк / столбцов из другого массива? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть два массива наборов данных, A и B. Это два разных независимых измерения (например, запах и цвет какого-либо объекта).

Для каждого ввода данных в A и B у меня есть время, t и местоположение, p измерения.Большинство измерений запаха и цвета были сделаны в одно и то же время и в одном месте.Тем не менее, в некоторых случаях данные отсутствуют (т. Е. В какое-то время не было измерения цвета и только измерения запаха).Точно так же в некоторых местах отсутствуют некоторые данные (т.е. в каком-то месте было только измерение цвета и отсутствие запаха).

Я хочу построить массивы A и B, которые имеют одинаковый размер в каждой строкесоответствует полному набору всех времен, и каждый столбец соответствует полному набору всех местоположений.Если отсутствуют данные, я хочу, чтобы эта запись была NaN.

Ниже приведен пример того, что я хочу сделать:

%Inputs    
A = [0 0 1 2 4; 1 1 3 3 2; 4 4 1 0 3];
t_A = [0.03 1.6 3.9]; %Times when A was measured (rows of A)

L_A = [1.0 2.9 2.98 4.2 6.33]; %Locations where A was measured (columns of A)

B = [10 13 10 10; 15 13 13 12; 14 14 13 12; 15 19 11 13];
t_B = [0.03 1.6 1.9 3.9]; %Times when B was measured (rows of B)
L_B = [2.1 2.9 2.98 5.0]; %Locations where B was measured (columns of B)

Мне нужен код для преобразования этих наборов данныхв следующее:

t = [0.03 1.6 1.9 3.9];
L = [1.0 2.1 2.9 2.98 4.2 5.0 6.33];

A_new = [0 NaN 0 1 2 NaN 4; 1 NaN 1 3 3 NaN 2; NaN NaN NaN NaN NaN NaN NaN;  4 NaN 4 1 0 NaN 3];

B_new = [NaN 10 13 10 NaN 10 NaN; NaN 15 13 13 NaN 12 NaN; NaN 14 14 13 NaN 12 NaN; NaN 15 19 11 NaN 13 NaN];

Новые массивы A_new и B_new имеют одинаковый размер, а векторы t и L (соответствующие строкам и столбцам) являются последовательными.Исходный A не имел данных при t = 1,9 и, следовательно, в 3-й строке в A_new есть все значения NaN.Аналогично для столбцов 2 и 6 в A_new и столбцов 1, 5 и 7 в B_new.

Как быстро это сделать в MATLAB для большого набора данных?

1 Ответ

0 голосов
/ 11 июня 2018

Создайте матрицу из NaN s, используйте третий вывод функции unique для преобразования плавающих чисел в целочисленные индексы и используйте индексирование матрицы для заполнения матриц:

[t,~,it] = unique([t_A t_B]);
[L,~,iL] = unique([L_A L_B]);

A_new = NaN(numel(t),numel(L));
A_new(it(1:numel(t_A)),iL(1:numel(L_A))) = A;


B_new = NaN(numel(t),numel(L));
B_new(it(numel(t_A)+1:end),iL(numel(L_A)+1:end)) = B;
...