2016-01-12 8 views
0

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

W = sparse(w1(:,1),w1(:,2),1,n,n); 

my n приблизительно равен 540 000 (это подмножество данных, которые у меня есть). Создание самой матрицы довольно легко вычислительно. Однако мне нужно получить собственные значения указанной матрицы. Точнее

rho = max(abs(eigs(W))); 

Эта одна строка кода берет навсегда. Немного поучав в этом, мне показалось, что получение собственных значений разреженной матрицы является дорогостоящим вычислительным. Я не могу использовать полную команду, например, uint8 (full (W)), так как в итоге я превысил максимальный размер матрицы/емкость (130 ГБ памяти). Однако, похоже, что если формат был uint8, я мог бы создать указанную полную матрицу смежности.

Любая помощь приветствуется. Мне кажется, что мне нужно одно из следующего:

  • Альтернативный способ построения матрицы смежности непосредственно в виде полного uint8;
  • Способ преобразования матрицы смежности, которую я создал для полного uint8; или
  • Альтернативный способ расчета этих собственных
+0

При написании ответа я предположил, что w1 будет несортированным и крупным, чтобы сортироваться быстро. Если это неверно, возможно создание столбца матрицы по столбцу, для которого требуется меньше памяти, чем ответ, который я написал. – Daniel

+0

Матрица 'uint8' размера n * n не подходит для вашей памяти. Он требует памяти '540000.^2/1024^3' ГБ, что составляет 271 ГБ. С такими большими матрицами использование «разреженного», вероятно, лучший выбор. – Daniel

+0

Пожалуйста, исправьте меня, если я ошибаюсь, но я просто понял, что функции 'eig' и' eigs' работают только в матрицах двойного типа. Кажется, что у меня нет альтернативного способа вычисления этих собственных значений на матлабе. –

ответ

0

С W = sparse(w1(:,1),w1(:,2),1,n,n); вы создаете матрицу, которая держит только 0 или 1. В то время как тип данных uint8 не представляется возможным, вы можете создать sparselogical матрицу вместо этого. Таким образом, можно избежать использования типов данных 64-битных

W = sparse(w1(:,1),w1(:,2),true,n,n); 
W = uint8(full(W)); 
0

Зная, что ваш план, чтобы использовать целые числа не решение, я прочитал ваш вопрос еще раз и понял, что вы тратите много производительности не надлежащим образом с помощью eigs. Если вас интересует только наибольшее собственное значение по величине, вычислите только это собственное значение.

rho = abs(eigs(W,1)); 
+0

Этот подход определенно лучше. Я протестировал на подматрицах 'W', однако, если я выйду за пределы 10 000 вещей, начните снова запутываться. Поскольку «rho = max (abs (eigs (W))) - спектральный радиус« W », я планировал использовать приближение к формуле Гельфанда, скажем,« normest (W^50)^(1/50) '. –

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

  • Нет связанных вопросов^_^