2013-07-19 4 views
3

скажем, у меня есть большая матрица X с множеством нулей, поэтому, конечно, я делаю ее разреженной, чтобы экономить на памяти и процессоре. После этого я делаю некоторые вещи, и в какой-то момент я хочу иметь ненулевые элементы. Мой код выглядит примерно так:ненулевые элементы разреженной матрицы

ind = M ~= 0; % Whereby M is the sparse Matrix 

Это выглядит довольно глупо, однако для меня, так как структура разреженной матрицы должна позволять непосредственное извлечение информации.

Чтобы уточнить: я не ищу решение, которое работает, но хотелось бы избегать делать то же самое дважды. Малая разрешенная матрица должна определить, что она уже отлична от нуля, поэтому ее не нужно искать.

ваш magu_

ответ

2

Прямой способ получения ненулевых элементов из разреженной матрицы - это позвонить nonzeros().

прямого путь, очевидно, метод быстрого, однако я провел несколько тестов против логической индексации на редком и его full() контрагента, а также индексации на прежнем быстрее (результаты зависят от характера разреженности и измерения матрицы).

Сумма времен более 100 итераций:

nonzeros: 0.02657 seconds 
sparse idx: 0.52946 seconds 
full idx: 2.27051 seconds 

Тестирование люкс:

N = 100; 
t = zeros(N,3); 
for ii = 1:N 
    s = sprand(10000,1000,0.01); 
    r = full(s); 

    % Direct call nonzeros 
    tic 
    nonzeros(s); 
    t(ii,1) = toc; 

    % Indexing sparse 
    tic 
    full(s(s ~= 0)); 
    t(ii,2) = toc; 

    % Indexing full 
    tic 
    r(r~=0); 
    t(ii,3) = toc; 
end 

sum(t) 
+0

Коды или комментарии для полного и редкого, похоже, переключаются. –

+0

@DennisJaheruddin Это не так. 'r' уже заполнен, и мне нужно преобразовать' s (...) 'в full, чтобы получить конечные результаты, и этот шаг попадает в сроки. – Oleg

+0

Да, это было именно то, что я искал (я имею в виду ненулевые). Дело в том. Мне было глупо делать ту же операцию (индексирование дважды). Thx для ответа. –

1

Я не 100% уверен, что вы после этого, но, может быть, [r c] = find(M) вам подходит лучше?

Вы можете получить значения M, перейдя по адресу M(r,c), но лучший способ, безусловно, будет продиктован тем, что вы намерены делать с приведенными ниже данными.

1

find функция рекомендована MATLAB:

[строка, столбец] = find (X, ...) возвращает индексы строк и столбцов ненулевых записей в матрице X. Этот синтаксис ax особенно полезен при работе с разреженными матрицами.

+0

Найти извлекает подтексты, которые уже хранятся разреженным объектом. 'nonzeros()' получает непосредственно значение без дополнительной индексации. – Oleg

1

Хотя find было предложено раньше, я думаю, что это является важным дополнением:

[r,c,v] = find(M); 

дает Вам не только индексы г, с, но и ненулевые значения v Используя. Команда nonzeros кажется немного быстрее, но найти в целом очень полезно при работе с разреженными матрицами, потому что векторы [r, c, v] описывают полную матрицу (кроме размерности матрицы).

Смежные вопросы