2014-11-05 1 views

ответ

2

Я только что посмотрел на LAPACK documentation. Я также посмотрел this post on Computational Science beta. Оказывается, нет никакой внутренней функции LAPACK, которая будет вычислять сумму матрицы в заданной размерности. Таким образом, MATLAB, вероятно, написал что-то обычай, чтобы таким образом облегчить сумму по заданному размеру матрицы.

Есть несколько способов обойти это, хотя:

  1. Compute матрично-векторное умножение с вектором всех 1s. Поскольку вы делаете sum(A,2), это означает, что вы хотите суммировать все столбцы для каждой строки. Вы можете инкапсулировать это поведение, выполнив y = A*x, где A - соответствующая матрица, а x - вектор всех 1s. y - это вывод, в котором вы должны получить сумму по всем столбцам для каждой строки в матрице. Таким образом, вы можете использовать sgemv и тщательно выбирать правильные входы так, чтобы вектор x состоял из всех 1s, а матрица A является рассматриваемой матрицей. Вам необходимо установить постоянную beta равным 0 и поставить вектор y равным нулю. Вам также необходимо установить alpha, равный 1.
  2. Вы можете выбрать собственный код, который перебирает все столбцы для каждой строки в вашей матрице и объединяет все элементы. Если вы попытаетесь выполнить вариант №1, эта операция не позволяет повторного использования кеша. Таким образом, большинство компиляторов должны иметь возможность оптимизировать код до максимальной производительности при написании собственного цикла.
  3. Другим методом является извлечение каждой строки вашей матрицы в виде вектора и вычисление точечного произведения этой строкой с вектором всех 1s. Возможно, использование чего-то вроде sdsdot сделало бы трюк.

Однако, если ваш код не тратит много времени на выполнение сумм, вы можете выбрать вариант №1. Если вы повторно делаете вычисления sum(A,2), тогда лучше всего написать свой собственный цикл (например, варианты № 2 или № 3).

Удачи вам!

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