Лучшая практика при работе с разреженными матрицами
Этот вопрос основан на обсуждении вэтот вопрос, Ранее я работал с разреженными матрицами, и я считаю, что способ работы с ними эффективен.
Мой вопрос двоякий:
НижеA = full(S)
гдеS
является разреженной матрицей
То есть что бы разреженный эквивалентvar = A(row, col)
быть?
Мой взгляд на эту тему: Вы бы не сделали ничего другого.var = S(row, col)
настолько эффективен, насколько это возможно. Я был оспорен на это с объяснением:
Получив доступ к элементу в строке 2 и столбце 2, как вы сказали, S (2,2) делает то же самое, что и добавление нового элемента:var = S(2,2)
=>A = full(S)
=>var = A(2,2)
=>S = sparse(A) => 4
.
Может ли это утверждение быть действительно правильным?
Какой «правильный» способ добавить элементы в разреженную матрицу?То есть то, что было бы редким эквивалентомA(row, col) = var
быть? (Предполагается, чтоA(row, col) == 0
начать с)
Известно, что просто занимаешьсяA(row, col) = var
медленно для больших разреженных матриц. Отдокументация:
Если вы хотите изменить значение в этой матрице, у вас может возникнуть желание использовать ту же индексацию:
B (3,1) = 42; % Этот код работает, однако он медленный.
Мой взгляд на эту тему: При работе с разреженными матрицами вы часто начинаете с векторов и используете их для создания матрицы следующим образом:S = sparse(i,j,s,m,n)
, Конечно, вы могли бы также создать его так:S = sparse(A)
или жеsprand(m,n,density)
или что-то подобное.
Если вы начнете первый путь, вы просто сделаете:
i = [i; new_i];
j = [j; new_j];
s = [s; new_s];
S = sparse(i,j,s,m,n);
Если бы у вас изначально не было векторов, вы бы сделали то же самое, но использовали быfind
первый:
[i, j, s] = find(S);
i = [i; new_i];
j = [j; new_j];
s = [s; new_s];
S = sparse(i,j,s,m,n);
Теперь у вас, конечно, есть векторы, и вы можете использовать их повторно, если выполняете эту операцию несколько раз. Однако было бы лучше добавить все новые элементы сразу, а не делать это в цикле, потому чторастущие векторы медленные, В этом случае,new_i
, new_j
а такжеnew_s
будут векторы, соответствующие новым элементам.