Cайт Алексея и Александра Друцы — программирование, ИТ, математика
Математические операции над векторами на Си

Исходный код на языке Си (C/C++) основных простейших математических операций над векторами, таких как скалярное произведение, сложение, умножение на число и различные нормы.

Ниже приведена небольшая библиотека (заголовочный файл + исходный код) простейших математических операций с векторами. Исходный код написан на языке Си (C/C++) и состоит из нескольких функций, обрабатывающих массивы действительных чисел.

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

В нынешней версии библиотеки находятся следующие функции:

  • функция копирования одного вектора в другой;
  • функция взятия скалярного произведения двух векторов;
  • функиця прибавления к данному вектору другого, умноженного на число;
  • функция умножения вектора на действительное число;
  • функция вычисления евклидовой нормы вектора (нормы l2);
  • функция вычисления нормы l1 вектора;
  • функция вычисления max-нормы вектора (linf);

Листинг файла vectoper.h
/* === Vector Operations === */
/* Some operations like scalar product, linear operations, etc */
/* copyrights www.adrutsa.ru */

#include "math.h"

void ad_vo_copy(long int n, double * u, double * v); /* u = v */

double ad_vo_scalprod(long int n, double * v, double *u); /* return u*v */

void ad_vo_addline(long int n, double * v, double * u, double c); /* v = v + u*c */

void ad_vo_scalmult(long int n, double * v, double c); /* v = v*c */

double ad_vo_norm_l2(long int n, double * v); /* l_2 norm of the vector v */

double ad_vo_norm_l1(long int n, double * v); /* l_1 norm of the vector v */

double ad_vo_norm_max(long int n, double * v); /* max norm (l_infinity norm) of the vector v */

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

Листинг файла vectoper.c
#include "vectoper.h"

void ad_vo_copy(long int n, double * u, double * v)
{
   long int i;
   for(i=0;i<n;i++) u[i]=v[i];
}

double ad_vo_scalprod(long int n, double * v, double *u)
{
   long int i;
   double s=0.;
   for(i=0;i<n;i++) s+=v[i]*u[i];
   return s;
}

void ad_vo_addline(long int n, double * v, double * u, double c)
{
   long int i;
   for(i=0;i<n;i++) v[i]+=u[i]*c;
}


void ad_vo_scalmult(long int n, double * v, double c)
{
   long int i;
   for(i=0;i<n;i++) v[i]*=c;
}

double ad_vo_norm_l2(long int n, double * v)
{
   long int i;
   double s=0.;
   for(i=0;i<n;i++) s+=v[i]*v[i];
   return sqrt(s);
}

double ad_vo_norm_l1(long int n, double * v)
{
   long int i;
   double s=0.;
   for(i=0;i<n;i++) s+=fabs(v[i]);
   return s;
}

double ad_vo_norm_max(long int n, double * v)
{
   long int i;
   double s=fabs(v[0]);
   for(i=0;i<n;i++) if (s<fabs(v[i])) s=fabs(v[i]);
   return s;
}
Цитаты

"К-мерная музыка - это слишком плоско"
- Жители k+1-ого измерения

At least now I'm sure you're not Pinochio, because if you were, your nose would've crashed into your monitor by now.
- TPB

The problem here seems to be that the material is unreleased? If that is the case, you can easily fix the problem by releasing it. We'll be more than glad to help you distribute it - free of charge! - to our users.
- TPB

 
© Alexey & Alexander Drutsa, 2009–2011