Быстрое удаление строк и столбцов из матрицы MATLAB
Есть ли быстрый способ удалить строки и столбцы из большой матрицы в MATLAB?
У меня очень большая (квадратная) матрица расстояний, я хочу удалить из строки несколько строк/столбцов.
Наивно:
s = 12000;
D = rand(s);
cols = sort(randsample(s,2))
rows = sort(randsample(s,2))
A = D;
tic
A(rows,:) = [];
A(:,cols) = [];
toc
% Elapsed time is 54.982124 seconds.
Это ужасно медленно.
Как ни странно, это самое быстрое решение, предложенное внизу здесь.
Улучшение может быть выполнено путем предварительного распределения массива и использования логических индексов
A = zeros(size(D) - [numel(rows) numel(cols)]);
r = true(size(D,1),1);
c = true(size(D,2),1);
r(rows) = false;
c(cols) = false;
tic
A = D(r,c);
toc
% Elapsed time is 20.083072 seconds.
Есть ли еще более быстрый способ сделать это?
Ответы
Ответ 1
Это похоже на узкое место в памяти. На моем слабым ноутбуке разрыв D и применение этих операторов к каждой части были намного быстрее (с использованием s = 12 000 разбился мой компьютер). Здесь я разбиваю его на две части, но вы можете найти более оптимальный раздел.
s = 8000;
D = rand(s);
D1 = D(1:s/2,:);
D2 = D((s/2 + 1):end,:);
cols = sort(randsample(s,2));
rows = sort(randsample(s,2));
A1 = D1;
A2 = D2;
tic
A1(rows(rows <= s/2),:) = [];
A2(rows(rows > s/2) - s/2,:) = [];
A1(:,cols) = [];
A2(:,cols) = [];
toc
A = D;
tic
A(rows,:) = [];
A(:,cols) = [];
toc
Elapsed time is 2.317080 seconds.
Elapsed time is 140.771632 seconds.
Ответ 2
Я думаю, что это будет зависеть от вашего использования, но у меня есть две идеи:
- Сделайте небольшую матрицу. Чем больше вы удаляете, тем лучше будет этот вариант.
- Почему вам нужно удалить значения? Не могли бы вы сделать:
A = D(randsample(s,2), randsample(s,2));
clear D;
% Use A