Лучшая практика при работе с разреженными матрицами

Этот вопрос основан на обсуждении вэтот вопрос, Ранее я работал с разреженными матрицами, и я считаю, что способ работы с ними эффективен.

Мой вопрос двоякий:

Ниже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 будут векторы, соответствующие новым элементам.

Ответы на вопрос(2)

Ваш ответ на вопрос