c++ valarray 实现矩阵与向量相乘
#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 实现矩阵与向量相乘的更多相关文章
- 学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵
线性代数,面向连续数学,非离散数学.<The Matrix Cookbook>,Petersen and Pedersen,2006.Shilov(1977). 标量.向量.矩阵.张量. ...
- Python 矩阵与矩阵以及矩阵与向量的乘法
import numpy as np numpy模块的array相乘时,有两种方式:一是矩阵形式,二是挨个相乘. 需要用矩阵形式相乘时,则要用np.dot()函数. #矩阵与矩阵相乘a = np.ar ...
- Eigen中的矩阵及向量运算
Eigen中的矩阵及向量运算 ,[+,+=,-,-=] ,[\*,\*=] ,[.transpose()] ,[.dot(),.cross(),.adjoint()] ,针对矩阵元素进行的操作[.su ...
- 学习笔记DL005:线性相关、生成子空间,范数,特殊类型矩阵、向量
线性相关.生成子空间. 逆矩阵A⁽-1⁾存在,Ax=b 每个向量b恰好存在一个解.方程组,向量b某些值,可能不存在解,或者存在无限多个解.x.y是方程组的解,z=αx+(1-α),α取任意实数. A列 ...
- Spark机器学习中ml和mllib中矩阵、向量
1:Spark ML与Spark MLLIB区别? Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向D ...
- MathType输入矩阵或者向量的注意事项
如图A区域是换行搞得,BC是插入矩阵,AC明显看着不一样,就是说行间不要使用换行,列间隔不要用空格(ctrl+shift+space),直接插入矩阵,向量就是矩阵的行或者列数目是1. 还有就是需要注意 ...
- 两矩阵各向量余弦相似度计算操作向量化.md
余弦相似度计算: \cos(\bf{v_1}, \bf{v_2}) = \frac{\left( v_1 \times v_2 \right)}{||v_1|| * ||v_2|| } \cos(\b ...
- matlab求矩阵、向量的模
求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...
- 掌握Spark机器学习库-05-spark中矩阵与向量的使用
1)介绍 矩阵: Matrix,看做二维表,基本运算(+,-,*,T) 向量: Vectors,方向和大小,基本运算,范数 2)spark中向量的使用(主要使用breeze.linalg) 3)spa ...
随机推荐
- html5——地理位置
获取地理位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- java 操作clob
之前在学校的时候做的都是练习,小儿科,遇到的情况完全都在自己的设想范围内.最近老是遇到字段溢出的情况,但是varchar2好像最长也只有4000个字符.所以不得不另辟蹊径,就找上了clob字段. pa ...
- JavaScript的基础数据类型和表达式
Java Script的基础数据类型和表达式 基本的数据类型: number(数值)类型:可分为整数和浮点数 string(字符)类型:是用单引号“'”或者双引号“"”来说明的. boole ...
- 汇总——WEB前端资源网
前端攻城师 爱思资源网 HTML5吧 0101后花园 前端网 编程教程和源代码示例 Javascript中文网 Web前端资源网 移动端HTML5资源整理 Web开发者 SegmentFault 前端 ...
- Android List,Set,Map集合安全 集合区别 并发集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合 Collection接口主要有两 ...
- comdlg32.dll
dll的应用,目前还不知道要怎么查看dll里的功能,暂且试着用了一个, 下面的Declare 分32位office软件和64位,如果是64位,要在Declare 后面加上PtrSafe ,定义的Typ ...
- 不用float也可以让div横向显示
display: inline-block; vertical-align: top; 就这两个属性,给div设置上,div就不会换行显示啦,而且还不影响横向的其他元素的显示.
- CAD从二制流数据中加载图形(com接口VB语言)
主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...
- 【转】resultMap详解(包含多表查询)
简介: MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对 ...
- 【Apache Kafka】一、Kafka简介及其基本原理
对于大数据,我们要考虑的问题有很多,首先海量数据如何收集(如Flume),然后对于收集到的数据如何存储(典型的分布式文件系统HDFS.分布式数据库HBase.NoSQL数据库Redis),其次存储 ...