Этот вопрос основан на обсуждении в этом вопросе. Раньше я работал с разреженными матрицами, и я убежден, что способ, которым я работал с ними, эффективен.
Мой вопрос двоякий:
В ниже, 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
будут векторами, соответствующими новым элементам.