У меня есть огромная матрица n × n A
, а индексы ее ненулевых элементов равны a = find(A)
. Я получил новый список a1
, удалив некоторые элементы из a
. Я хочу иметь матрицу A
индексов в a1
без использования циклов. Какие-либо предложения? Есть ли какая-нибудь функция для этой цели?
Создайте новую матрицу из индексов
Ответы (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
Вы должны либо убедиться, что нет матрицы
B
больше, чем A
перед запуском этого кода, либо явно инициализировать его, например,: B = zeros(size(A));
.
- person Eitan T; 26.05.2013
если
A
больше, чем, скажем, 1000x1000, написанная мной инициализация будет работать быстрее, чем явная B = zeros(size(A));
. Выбор B
предполагает отсутствие предыдущей матрицы с именем B
, я думал, что это очевидно...
- person bla; 26.05.2013
Я знаю, что это будет работать быстрее, у нас было долгое обсуждение об этом, помните? :) Я имел в виду, что вам нужно убедиться, что размер инициализируемой матрицы
B
правильный. P.S: откуда вы знаете, что a1
логично? Вы имели в виду векторное индексирование?
- person Eitan T; 26.05.2013
да, я имел в виду векторную индексацию... спасибо, что заметили, я отредактирую ответ. Как
B(size(A,1),size(A,2))=0;
может быть другого размера, чем A
? что мне не хватает?
- person bla; 26.05.2013
Что ж, если
B
уже существует и, скажем, вдвое больше A
, то вы просто устанавливаете один элемент в B
в ноль, а не сбрасываете всю матрицу. Перед этим необходимо очистить B
.
- person Eitan T; 26.05.2013