#include <iostream>
#include <valarray>

template<class T> class Slice_iter {
  std::valarray<T>* v;
  std::slice s;
  size_t curr;
  T& ref(size_t i) const {
    return (*v)[s.start()+i*s.stride()];
  }
public:
  Slice_iter(std::valarray<T> *vv, std::slice ss):v(vv),s(ss),curr(0) {}
  Slice_iter end() {
    Slice_iter t=*this;
    t.curr=s.size();
    return t;
  }
  Slice_iter& operator++() {curr++; return *this;}
  Slice_iter operator++(int) {Slice_iter t=*this; curr++; return t;}
  T& operator[] (size_t i) {return ref(curr=i);}
  T& operator* () {return ref(curr);}

  size_t size() const {return s.size();}

  template<class U>
  friend bool operator==(const Slice_iter<U>&, const Slice_iter<U>&);
  template<class U>
  friend bool operator!=(const Slice_iter<U>&, const Slice_iter<U>&);
  template<class U>
  friend bool operator<(const Slice_iter<U>&, const Slice_iter<U>&);
};

template<class T> bool operator==(const Slice_iter<T>& p, const Slice_iter<T>& q) {
  return p.curr==q.curr && p.s.stride()==q.s.stride() && p.s.start()==q.s.start();
}

template<class T> bool operator!=(const Slice_iter<T>& p, const Slice_iter<T>& q) {
  return !(p==q);
}

template<class T> bool operator<(const Slice_iter<T>& p, const Slice_iter<T>& q) {
  return p.curr<q.curr && p.s.stride()==q.s.stride() && p.s.start()==q.s.start();
}

class Matrix {
  std::valarray<double>* v;
  size_t d1, d2;
public:
  Matrix(size_t x, size_t y);
  Matrix(const Matrix&);
  Matrix& operator=(const Matrix&);
  ~Matrix() {
    if(!v)
      delete v;
  }

  size_t size() const {return d1*d2;}
  size_t dim1() const {return d1;}
  size_t dim2() const {return d2;}

  Slice_iter<double> row(size_t i);
  Slice_iter<double> column(size_t i);

  Slice_iter<double> operator[] (size_t i) {return row(i);}

  Matrix& operator*=(double);

  std::valarray<double>& array() {return *v;}
};

inline Slice_iter<double> Matrix::row(size_t i) {
  return Slice_iter<double>(v, std::slice(i*d2,d2,1));
}

inline Slice_iter<double> Matrix::column(size_t i) {
  return Slice_iter<double>(v, std::slice(i, d1, d2));
}

Matrix::Matrix(size_t x, size_t y) {
  d1=x;
  d2=y;
  v=new std::valarray<double> (x*y);
}

double mul(Slice_iter<double> v1, const std::valarray<double>& v2) {
  double res=0;
  for(int i=0; i<v1.size(); ++i)
    res+=v1[i]*v2[i];

  return res;
}

std::valarray<double> operator*(Matrix& m, const std::valarray<double>& v) {
  std::valarray<double> res(m.dim1());
  for(int i=0;i<m.dim1();++i)
    res[i]=mul(m.row(i), v);

  return res;
}

Matrix& Matrix::operator*=(double d) {
  (*v) *= d;
  return *this;
}

size_t slice_index(const std::slice& s, size_t i) {
  return s.start()+i*s.stride();
}

void print_seq(const std::slice& s) {
  for(int i=0;i<s.size(); ++i)
    std::cout<<slice_index(s,i)<<" ";
}

int main() {
  const double vd[] = {1,2,3,4,5,6,7,8};
  std::valarray<double> v(vd, sizeof(vd)/sizeof(vd[0]));
  Matrix MyMat(2, 4);
  MyMat.array()=v;

  std::cout<<"dim1 = "<<MyMat.dim1()<<" ";
  std::cout<<"dim2 = "<<MyMat.dim2()<<"\n";

  for(size_t i=0;i<MyMat.dim1();++i) {
    for(size_t j=0;j<MyMat.dim2();++j) {
      std::cout<<MyMat.row(i)[j]<<" ";
    }
    std::cout<<"\n";
  }

  std::slice seg(0, 4, 1);
  std::valarray<double> bar=v[seg];
  for(size_t i=0; i<bar.size(); ++i) {
    std::cout<<bar[i]<<" ";
  }

  std::cout<<"\n";

  std::cout<<"The product of MyMat and bar is: \n";
  std::valarray<double> res=MyMat*bar;

  for(size_t i=0;i<res.size();++i) {
    std::cout<<res[i]<<" ";
  }
  std::cout<<"\n";

  return 0;
}

c++ valarray 实现矩阵与向量相乘的更多相关文章

  1. 学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵

    线性代数,面向连续数学,非离散数学.<The Matrix Cookbook>,Petersen and Pedersen,2006.Shilov(1977). 标量.向量.矩阵.张量. ...

  2. Python 矩阵与矩阵以及矩阵与向量的乘法

    import numpy as np numpy模块的array相乘时,有两种方式:一是矩阵形式,二是挨个相乘. 需要用矩阵形式相乘时,则要用np.dot()函数. #矩阵与矩阵相乘a = np.ar ...

  3. Eigen中的矩阵及向量运算

    Eigen中的矩阵及向量运算 ,[+,+=,-,-=] ,[\*,\*=] ,[.transpose()] ,[.dot(),.cross(),.adjoint()] ,针对矩阵元素进行的操作[.su ...

  4. 学习笔记DL005:线性相关、生成子空间,范数,特殊类型矩阵、向量

    线性相关.生成子空间. 逆矩阵A⁽-1⁾存在,Ax=b 每个向量b恰好存在一个解.方程组,向量b某些值,可能不存在解,或者存在无限多个解.x.y是方程组的解,z=αx+(1-α),α取任意实数. A列 ...

  5. Spark机器学习中ml和mllib中矩阵、向量

    1:Spark ML与Spark MLLIB区别? Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向D ...

  6. MathType输入矩阵或者向量的注意事项

    如图A区域是换行搞得,BC是插入矩阵,AC明显看着不一样,就是说行间不要使用换行,列间隔不要用空格(ctrl+shift+space),直接插入矩阵,向量就是矩阵的行或者列数目是1. 还有就是需要注意 ...

  7. 两矩阵各向量余弦相似度计算操作向量化.md

    余弦相似度计算: \cos(\bf{v_1}, \bf{v_2}) = \frac{\left( v_1 \times v_2 \right)}{||v_1|| * ||v_2|| } \cos(\b ...

  8. matlab求矩阵、向量的模

    求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...

  9. 掌握Spark机器学习库-05-spark中矩阵与向量的使用

    1)介绍 矩阵: Matrix,看做二维表,基本运算(+,-,*,T) 向量: Vectors,方向和大小,基本运算,范数 2)spark中向量的使用(主要使用breeze.linalg) 3)spa ...

随机推荐

  1. C# 学习——静态(第四天)

    一.命名空间 类似于文件夹,而类就是文件夹中的文件: 作用:明确的指向我们所需要的类的 所在的位置: 统一命名空间下,类名不能重复. 二.类 概念:具有相同属性和功能的对象的抽象的集合. 三.静态与实 ...

  2. Centos6.7 编译安装 Apache PHP

    Centos6.7 编译安装 Apache PHP 原文地址:http://www.cnblogs.com/caoguo/p/4968039.html ##### Apache 编译安装 #### [ ...

  3. (转)分布式文件存储FastDFS(六)FastDFS多节点配置

    http://blog.csdn.net/xingjiarong/article/details/50759918 前面几篇关于FastDFS的博客中介绍了如何在一台机器上搭建一个简易的FastDFS ...

  4. docker安装后出现Cannot connect to the Docker daemon

    启动docker service docker start docker安装后出现Cannot connect to the Docker daemon You need to add user in ...

  5. CDR真实图片转水墨画效果制作教程

    CorelDRAW创造性滤镜组是最具有创造力的滤镜,使用里面的散开滤镜能够实现类似于水墨的表现手法,然后再结合图层的合并模式,让您的图片产生意想不到的视觉效果.本文将利用CorelDRAW软件中提供的 ...

  6. VS2015编译ffmpeg的问题解决

    刚装了vs2015,打开一些ffmpeg项目,发现不能编译通过,包括stdio.h都无法找到,可能是vs2015的bug吧. 现在记录一下解决方法: 我的目录是这样定义的: C:\Program Fi ...

  7. 关于JS中的方法是否加括号的问题

    js中的方法什么时候加括号什么时候不加括号呢,我们有时候经常就搞不清楚,记住下面这几点就好理解了. 1.函数做参数时都不要加括号. function fun(a){ alert(a); } funct ...

  8. modelsim 仿真软件 百度云分享 modelsim se 10.7 10.6d 10.6c 10.5 10.4

    modelsim se 10.7 链接:https://pan.baidu.com/s/1NDC2yMCZmA4bIRSk2dUiTg 提取码:4l1d 复制这段内容后打开百度网盘手机App,操作更方 ...

  9. swift-延时加载函数

    //延时加载函数 func delayLoad(){ let time: NSTimeInterval = 2.0 let delay = dispatch_time(DISPATCH_TIME_NO ...

  10. C#关键字详解第一节

    abstract:抽象类: 他表达对问题或者实际中的事物,对象等所设计出的抽象概念,比如一个灵感.生物等,这些都是抽像, 但是他们往往也有具体的指向,比如生物圈有人类,猴子,老虎等等,老虎和人类是实际 ...