Получите доступ к нескольким элементам и назначьте каждому выбранному элементу другое значение

Мне нужно знать, есть ли какой-либо эффективный способ сделать следующее в MATLAB.

У меня есть несколько больших разреженных матриц размером примерно 9000000x9000000.

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

Что я имею:

  • РАЗРЕЖЕННАЯ МАТРИЦА размером 9000000x9000000
  • Матрица со списком индексов и значений, к которым я хочу получить доступ, это такая матрица:

    [row1, col1, value1;
     row2, col2, value2;
     ...
     rowN, colN, valueN]
    

Где N - длина такой матрицы.

Что мне нужно:

Присвойте SPARSE MATRIX соответствующее значение соответствующему индексу, это:

SPARSE_MATRIX(row1, col1) = value1
SPARSE_MATRIX(row2, col2) = value2
...
SPARSE_MATRIX(rowN, colN) = valueN

Заранее спасибо!


РЕДАКТИРОВАТЬ:

Спасибо обоим за ответ, я думаю, что я плохо объяснил, я попробую еще раз.

У меня уже есть большая РАЗБОРНАЯ МАТРИЦА размером около 9000000 строк x 9000000 столбцов, это РАЗБОРНАЯ МАТРИЦА, заполненная нулями.

Затем у меня есть еще один массив или матрица, назовем ее M с N количеством строк, где N может принимать значения от 0 до 9000000; и 3 колонки. Первые два столбца используются для индексации элемента моей РАЗБОРНОЙ МАТРИЦЫ, а в третьем столбце хранится значение, которое я хочу передать в РАЗБОРНУЮ МАТРИЦУ, то есть для случайной строки M, i:

SPARSE_MATRIX(M(i, 1), M(i, 2)) = M(i, 3)

Идея состоит в том, чтобы сделать это для всех строк, я пробовал это с общей индексацией:

SPARSE_MATRIX(M(:, 1), M(:, 2)) = M(:, 3)

Теперь я хотел бы сделать это назначение для всех строк в M как можно быстрее, потому что, если я использую цикл или обычное индексирование, это занимает много времени (я использую процессор i7 7-го поколения с 16 ГБ ОЗУ). И мне также нужно сохранить нули в SPARSE_MATRIX.

  • РЕДАКТИРОВАТЬ 2: РЕШЕНО! Спасибо, Метахоминид, я не думал об этом, но да, разреженная функция действительно решает мою проблему, я просто думаю, что вчера мои мозговые цепи были закорочены, и я не мог видеть сквозь них, хахаха. В любом случае спасибо обоим!

С уважением!


person Smolpi    schedule 01.06.2018    source источник


Ответы (2)


Вы можете создать разреженную матрицу, например эту.

A = sparse(i,j,v)

S = sparse(i,j,v) генерирует разреженную матрицу S из троек i, j и v, такую ​​что S(i(k),j(k)) = v(k). Выходная матрица max(i)-by-max(j) имеет пространство, выделенное для ненулевых элементов length(v). sparse объединяет элементы в v, которые имеют повторяющиеся индексы в i и j.

Таким образом, вы можете просто построить вектор-строку, вектор-столбец и вектор значений.

person Community    schedule 01.06.2018

Я отвечаю частично, потому что не могу комментировать. Ваш вопрос кажется мне немного запутанным. Функция sparse() в MATLAB делает именно это.

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

Учитывая ваш формат данных, создайте три вектора: ROWS = [row1; ...; ряд], COLS = [col1; ...; столбец] и ДАННЫЕ = [знач1; ...валн]. Я предполагаю, что ваш размер - это общий размер полной матрицы, а не разреженной части.

Затем

A = sparse(ROWS, COLS, DATA) будет делать именно то, что вы хотите. Можно даже указать исходный размер матрицы.

A = разреженный (СТРОКИ, ЦВЕТЫ, ДАННЫЕ, 90...., 90....).

person Community    schedule 01.06.2018