TL; DR : я пытаюсь оптимизировать следующий короткий код в Matlab. Поскольку он включает циклы над большими матрицами, он слишком медленный.
for i = 1:sz,
for j = 1:sz,
if X(j) == Q(i) && Y(j) == R(i),
S(i) = Z(j);
break
end
end
end
Особенности : По сути, я начал с трех векторов данных x, y и z, которые я хотел построить как поверхность. Я сгенерировал сетку из данных x и y, а затем сделал матрицу для соответствующих значений z, используя
[X, Y] = meshgrid(x, y);
Z = griddata(x, y, z, X, Y);
Поскольку данные собираются в случайном порядке, при создании графика поверхности все соединения неправильны, и график выглядит все триангулированным, как в следующем примере.
Итак, чтобы убедиться, что Matlab соединял правильные точки, я затем реорганизовал матрицы X и Y, используя
[R, R_indx] = sort(Y);
[Q, Q_indx] = sort(X, 2);
Отсюда я подумал, что это будет простая проблема реорганизации матрицы Z на основе индексов сортировки для матриц X и Y. Но я сталкиваюсь с проблемами, потому что независимо от того, как я использую индексы, я не могу произвести правильную матрица. Например я попробовал
S = Z(R_indx); % to match the rearrangement of Y
S = S(Q_indx); % to match the rearrangement of X
и я получил этот штрих-код ...
Запуск первого блока кода дает мне «желаемый» результат, изображенный здесь. Однако это занимает слишком много времени, поскольку это двойная петля над очень большой матрицей.
Вопрос : Как мне оптимизировать эту перестановку матрицы Z без использования циклов?