Разреженный или нормальный массив Matlab - PullRequest
11 голосов
/ 20 июля 2010

В Matlab, в какой момент иметь разреженный массив лучше, чем обычный массив, если у меня еще много вычислений, и около 25% массива не равны нулю?

Ответы [ 2 ]

21 голосов
/ 20 июля 2010

Лично я редко бы удосужился использовать разреженный массив, состоящий только из 25% ненулевых элементов.Если вы мне не верите, попробуйте сами.

A = sprand(2000,2000,0.25);
tic,B = A*A;toc
Elapsed time is 1.771668 seconds.

Af = full(A);
tic,B = Af*Af;toc
Elapsed time is 0.499045 seconds.

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

A = sprand(2000,2000,0.005);
Af = full(A);

tic,B = A*A;toc
Elapsed time is 0.037763 seconds.

tic,B = Af*Af;toc
Elapsed time is 0.446680 seconds.

Конечно, ваша собственная проблема будет другой, но она не будет такой другой.Разреженные матрицы - это истинное благо для человека, который использует действительно разреженные матрицы, но 25% ненулей просто не достаточно "разреженно" для любого усиления в большинстве случаев.

4 голосов
/ 20 июля 2010

Редактировать - неправильно прочитать квест.

При 75% разреженности вы можете очень хорошо увидеть значительное увеличение производительности при использовании алгоритмов с разреженной матрицей. Я бы сказал, что стоит попробовать.

В двух местах, где вы будете экономить память (например, сокращение использования памяти в четыре раза) и операции (например, каждый раз, когда вы умножаете матричный вектор, вы значительно сокращаете количество требуемых операций ). Смягчающим фактором в вашем случае может быть размер вашей матрицы. Переходя к работе с разреженными матрицами, вы обычно теряете хорошие характеристики кэширования, которые вы видите с плотными матрицами. Таким образом, обычно существует порог, при котором переход от плотного к разреженному приводит к повышению эффективности.

...