Быстрое удаление строк и столбцов из матрицы MATLAB - PullRequest
17 голосов
/ 12 ноября 2010

Существует ли быстрый способ удаления строк и столбцов из большой матрицы в 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.

Есть еще более быстрый способ сделать это?

Ответы [ 2 ]

9 голосов
/ 12 ноября 2010

Похоже на узкое место в памяти. На моем слабом ноутбуке разбивание 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.
0 голосов
/ 12 ноября 2010

Я думаю, это будет зависеть от вашего использования, но у меня есть две идеи:

  1. Сделать это разреженной матрицей.Чем больше вы удаляете, тем лучше будет эта опция.
  2. Зачем вам нужно удалять значения?Не могли бы вы сделать:

<code>
A = D(randsample(s,2), randsample(s,2));
clear D;
% Use A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...