Создайте новую матрицу из индексов

У меня есть огромная матрица n × n A, а индексы ее ненулевых элементов равны a = find(A). Я получил новый список a1, удалив некоторые элементы из a. Я хочу иметь матрицу A индексов в a1 без использования циклов. Какие-либо предложения? Есть ли какая-нибудь функция для этой цели?


person Fatime    schedule 26.05.2013    source источник


Ответы (2)


Учитывая, что ваша матрица «огромна» (и ваш вопрос подразумевает, что она в основном состоит из нулей), возможно, было бы лучше, если бы вы представили ее как разреженная матрица:

[ii, jj] = ind2sub(size(A), a1);
spA = sparse(ii, jj, A(a1), size(A, 1), size(A, 2));

При работе с разреженными матрицами может быть значительное ускорение. Если вам нужно получить полную матрицу обратно, используйте full:

newA = full(spA);
person Eitan T    schedule 26.05.2013

Используйте векторное индексирование. Не зная, насколько «огромной» является ваша матрица A, но предполагая, что вы все еще можете обрабатывать ее целиком в памяти Matlab, просто:

B(size(A,1),size(A,2))=0;
B(a1)=A(a1);

Теперь B совпадает с A только с индексами, заданными a1.

person bla    schedule 26.05.2013
comment
Вы должны либо убедиться, что нет матрицы B больше, чем A перед запуском этого кода, либо явно инициализировать его, например,: B = zeros(size(A));. - person Eitan T; 26.05.2013
comment
если A больше, чем, скажем, 1000x1000, написанная мной инициализация будет работать быстрее, чем явная B = zeros(size(A));. Выбор B предполагает отсутствие предыдущей матрицы с именем B, я думал, что это очевидно... - person bla; 26.05.2013
comment
Я знаю, что это будет работать быстрее, у нас было долгое обсуждение об этом, помните? :) Я имел в виду, что вам нужно убедиться, что размер инициализируемой матрицы B правильный. P.S: откуда вы знаете, что a1 логично? Вы имели в виду векторное индексирование? - person Eitan T; 26.05.2013
comment
да, я имел в виду векторную индексацию... спасибо, что заметили, я отредактирую ответ. Как B(size(A,1),size(A,2))=0; может быть другого размера, чем A? что мне не хватает? - person bla; 26.05.2013
comment
Что ж, если B уже существует и, скажем, вдвое больше A, то вы просто устанавливаете один элемент в B в ноль, а не сбрасываете всю матрицу. Перед этим необходимо очистить B. - person Eitan T; 26.05.2013