2014-09-19 3 views
2

Я заполняю разреженную матрицу Р (230К, 290K) со значениями, поступающих из текстового файла, который я прочитал построчно, здесь (упрощенный) кодразреженных матриц Назначение становится очень медленным в Matlab

while ... 
      C = textscan(text_line,'%d','delimiter',',','EmptyValue', 0); 
      line_number = line_number+1; 
      P(line_number,:)=C{1}; 
end 

проблема у меня в том, что в то время как в начале заявление

P(line_number,:)=C{1}; 

быстро, после нескольких тысяч строк становятся exterely медленно, я думаю, потому что Matlab нужно найти место в памяти, чтобы выделить каждый раз. Есть ли способ предварительно выделить память с разреженными матрицами? Я так не думаю, но, может быть, я чего-то не хватает. Любые другие рекомендации, которые могут ускорить работу (например, иметь много свободного ОЗУ, могут иметь значение?)

+0

На сегодняшний день самым быстрым способом создания разреженной матрицы является загрузка всех значений за один раз, а затем генерация разреженной матрицы в один вызов «разреженной». Однако может быть лучший способ сделать то, что вам нужно. Как вы будете работать с матрицей 'P', как только вы прочтете данные? –

+0

Вы имеете в виду присвоение значения нормальной матрице, а затем преобразование ее в разреженный? Я не претендую, это возможно, матрица очень большая. Я на самом деле использую код, предложенный здесь http://stackoverflow.com/questions/24789600/handling-a-very-big-and-sparse-matrix-in-matlab, чтобы заполнить матрицу, оказалось, что это хорошо, но, как сказал, через некоторое время становится очень медленным. – Eugenio

+1

Нет, я имею в виду чтение всех значений в виде вектора, создание векторов их адресатов столбцов и строк, а затем вызов 'разреженных' для создания разреженной матрицы для вас за один раз (см. Документацию для' разреженных'). –

ответ

0

На сегодняшний день самым быстрым способом создания разреженной матрицы witin matlab является загрузка всех значений за один раз, а затем генерирование разреженной матрицы за один вызов до sparse. Вы должны загрузить данные и упорядочить их в векторы, определяющие индексы и значения строк и столбцов для каждой заполненной ячейки. Затем вы можете вызвать sparse, используя синтаксис S = sparse(i,j,s,m,n).

+0

Если матрица гигантская, можно загрузить все данные. как мы должны это делать? – Ehsan

+0

Я имею в виду, что невозможно загрузить все данные – Ehsan

2

Существует шестой входной аргумент sparse, который сообщает количество ненулевых элементов в матрице. Вот используется Matlab, чтобы предварительно выделить:

S = sparse(i,j,s,m,n,nzmax) использует векторы i, j и s для генерации mn матрицы с размерностью разреженной матрицы таким образом, что S(i(k),j(k)) = s(k), с пространством , выделенным для nzmax ненулевых.

Таким образом, вы могли бы initiallize с

P = sparse([],[],[],230e3,290e3,nzmax); 

Вы можете сделать предположение о количестве ненулевых (возможно, проверка размера файла?) И использовать его в качестве nzmax. Если в конце концов вам понадобится больше ненулевых элементов, Matlab будет предубеждать «на лету» (медленно).

+0

Я пробовал, P2 = разреженный ([], [], [], m, n, 60000000); но назначение значений по-прежнему медленное после нескольких тысяч строк, более или менее время выполнения одинаково.Итак, распределение памяти не является узким местом? – Eugenio

+0

@Eugenio Казалось бы, так. Но я не знаю, как Matlab выделяет память с разреженными матрицами. –

Смежные вопросы