Как назначить векторы (по четвертому измерению) предварительно заданным индексам - PullRequest
0 голосов
/ 16 января 2019

У меня есть матрица координат матрицы x, y, z, а также матрица векторов строк, соответствующих временным рядам, связанным с этими координатами. Э.Г.

coordinates = [1 2 3; 57 89 22]; % Where the column 1 = x, column 2 = y, column 3 = z
timeseries = rand(2,200); % where each row corresponds to the timeseries of the coordinates in the same row in the coordinates matrix.

Я хочу построить 4D матрицу, содержащую эти временные ряды. Любая неназначенная координата по умолчанию должна содержать вектор нулей. В настоящее время я делаю это следующим образом:

M = zeros(100,100,100,200); 
for ii = 1:size(coordinates,1)
    M(coordinates(ii,1),coordinates(ii,2),coordinates(ii,3),:) = timeseries(ii,:);
end

Это работает, но мне было интересно, есть ли (более читаемый / эффективный) метод для записи цикла for за один шаг. Я пытался использовать логические массивы и индексы, но это всегда не получается, потому что я назначаю векторы, а не скаляры.

1 Ответ

0 голосов
/ 16 января 2019

Вот способ использования sub2ind. Я не рассчитал это:

sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = sub2ind(sz([1 2 3]), coordinates(:,1), coordinates(:,2), coordinates(:,3));
M(ind(:),:) = timeseries;
M = reshape(M, sz);

Вы можете немного увеличить скорость, заменив sub2ind на ручной расчет:

sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = coordinates(:,1) + sz(1)*(coordinates(:,2)-1) + sz(1)*sz(2)*(coordinates(:,3)-1);
M(ind(:),:) = timeseries;
M = reshape(M, sz);
...