Получите доступ к нескольким элементам и назначьте каждому выбранному элементу другое значение - PullRequest
0 голосов
/ 01 июня 2018

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

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

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

Что у меня есть:

  • SPARSE MATRIX размером 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

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


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

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

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

Тогда у меня есть другой массив или матрица, назовем его M с N числом строк, где N может принимать значения от 0 до 9000000;и 3 колонки.Первые два столбца используются для индексации элемента моей SPARSE MATRIX, а в третьем столбце хранится значение, которое я хочу передать в SPARSE MATRIX, то есть с учетом случайной строки M, i:

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

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

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

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

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

С уважением!

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

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

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

Учитываяваш формат данных состоит из трех векторов, ROWS = [row1;...;rown], COLS = [col1;...;coln] и DATA = [val1;... Вальн].Я предполагаю, что ваш размер является общим размером полной матрицы, а не разреженной части.

Тогда

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

A = разреженный (ROWS, COLS, DATA, 90 ...., 90 ....).

0 голосов
/ 01 июня 2018

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

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) имеет пространство, отведенное для ненулевых элементов длины (v).sparse складывает элементы в v, которые имеют дубликаты индексов в i и j.

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

...