2019年8月19日矩阵
定义
的矩阵,B为
的矩阵,那么称
的矩阵C为矩阵A与B的乘积,记作
,其中矩阵C中的第
行第
列元素可以表示为:
注意事项
- 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
- 乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。
基本性质
- 乘法结合律: (AB)C=A(BC). [2]
- 乘法左分配律:(A+B)C=AC+BC [2]
- 乘法右分配律:C(A+B)=CA+CB [2]
- 对数乘的结合性k(AB)=(kA)B=A(kB).
- 转置 (AB)T=BTAT.
- 矩阵乘法一般不满足交换律 [3] 。
乘积-哈达马积( hadamard product)
矩阵
与
矩阵
的Hadamard积记为
。其元素定义为两个矩阵对应元素的乘积
的m×n矩阵 [2] 。例如,
乘积
。克罗内克积也成为直积或张量积 [4] .以德国数学家利奥波德·克罗内克命名。计算过程如下例所示:
实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
struct Matrix:vector<vector< int > > //使用标准容器vector做基类,需#include语句
{
Matrix( int x=0, int y=0, int z=0) //初始化,默认为0行0列空矩阵
{
assign(x,vector< int >(y,z));
}
int h_size() const //常量说明不可省,否则编译无法通过
{
return size();
}
int l_size() const
{
return empty()?0:front().size(); //列数要考虑空矩阵的情况
}
Matrix pow ( int k); //矩阵的k次幂,用快速幂实现,k为0时返回此矩阵的单位矩阵
};
Matrix operator*( const Matrix &m, const Matrix &n) //常量引用避免拷贝
{
if (m.l_size()!=n.h_size()) return Matrix(); //非法运算返回空矩阵
Matrix ans(m.h_size(),n.l_size());
for ( int i=0; i!=ans.h_size(); ++i)
for ( int j=0; j!=ans.l_size(); ++j)
for ( int k=0; k!=m.l_size(); ++k)
ans[i][j]+=m[i][k]*n[k][j];
return ans;
}
Matrix Matrix:: pow ( int k)
{
if (k==0)
{
Matrix ans(h_size(),h_size());
for ( int i=0; i!=ans.h_size(); ++i)
ans[i][i]=1;
return ans;
}
if (k==2) return (* this )*(* this );
if (k%2) return pow (k-1)*(* this );
return pow (k/2). pow (2);
}
|
实际应用
数据统计
工厂\产品 | P1 | P2 | P3 |
---|---|---|---|
甲 | 5 | 2 | 4 |
乙 | 3 | 8 | 2 |
丙 | 6 | 0 | 4 |
丁 | 0 | 1 | 6 |
,其中四行分别表示甲乙丙丁四个工厂的生产情况,三列分布表示三种产品P1,P2,P3的产量。
,其中第一列表示三种产品的单件利润,第二列表示三种产品的单件体积。
VOJ1067
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 10
using namespace std;
const int mod = 7777777;
typedef long long LL;
struct matrix{
LL a[10][10];
}origin;
int n,m;
matrix multiply(matrix x,matrix y)
{
matrix temp;
memset (temp.a,0, sizeof (temp.a));
for ( int i=0;i<n;i++)
{
for ( int j=0;j<n;j++)
{
for ( int k=0;k<n;k++)
{
temp.a[i][j]+=x.a[i][k]*y.a[k][j];
temp.a[i][j]=(temp.a[i][j])%mod;
}
}
}
return temp;
}
matrix matmod(matrix A, int k)
{
matrix res;
memset (res.a,0, sizeof res.a);
for ( int i=0;i<n;i++) res.a[i][i]=1;
while (k)
{
if (k&1) res=multiply(res,A);
k>>=1;
A=multiply(A,A);
}
return res;
}
void print(matrix x)
{
for ( int i=0;i<n;i++)
{
for ( int j=0;j<n;j++)
cout<< " " <<x.a[i][j]; puts ( "" );
}
printf ( "---------------\n" );
}
int main()
{
int k;
while (cin>>n>>k)
{
memset (origin.a,0, sizeof origin.a);
origin.a[0][0]=1;
for ( int i=1;i<=n;i++)
{
origin.a[i][0]=1;
for ( int j=0;j<i;j++)
origin.a[i][0]+=origin.a[j][0];
}
// print(origin);
matrix res;
memset (res.a,0, sizeof res.a);
for ( int i=0;i<n-1;i++)
res.a[i][i+1]=1;
for ( int i=0;i<n;i++) res.a[n-1][i]=1;
//print(res);
res=matmod(res,k-1);
LL fans=0;
for ( int i=0;i<n;i++)
{
fans+=res.a[0][i]*origin.a[i][0];
fans%=mod;
}
cout<<fans<<endl;
}
return 0;
}
|
经典题目9
经典题目10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include <cstdio>
#define SIZE (1<<m)
#define MAX_SIZE 32
using namespace std;
class CMatrix
{
public :
long element[MAX_SIZE][MAX_SIZE];
void setSize( int );
void setModulo( int );
CMatrix operator* (CMatrix);
CMatrix power( int );
private :
int size;
long modulo;
};
void CMatrix::setSize( int a)
{
for ( int i=0; i<a; i++)
for ( int j=0; j<a; j++)
element[i][j]=0;
size = a;
}
void CMatrix::setModulo( int a)
{
modulo = a;
}
CMatrix CMatrix::operator* (CMatrix param)
{
CMatrix product;
product.setSize(size);
product.setModulo(modulo);
for ( int i=0; i<size; i++)
for ( int j=0; j<size; j++)
for ( int k=0; k<size; k++)
{
product.element[i][j]+=element[i][k]*param.element[k][j];
product.element[i][j]%=modulo;
}
return product;
}
CMatrix CMatrix::power( int exp )
{
CMatrix tmp=(* this )*(* this );
if ( exp ==1) return * this ;
else if ( exp &1) return tmp.power( exp /2)*(* this );
else return tmp.power( exp /2);
}
int main()
{
const int validSet[]={0,3,6,12,15,24,27,30};
long n, m, p;
CMatrix unit;
scanf ( "%d%d%d" , &n, &m, &p);
unit.setSize(SIZE);
for ( int i=0; i<SIZE; i++)
for ( int j=0; j<SIZE; j++)
if (((~i)&j) == ((~i)&(SIZE-1)))
{
bool isValid= false ;
for ( int k=0;k<8;k++) isValid=isValid||(i&j)==validSet[k];
unit.element[i][j]=isValid;
}
unit.setModulo(p);
printf ( "%d" ,unit.power(n).element[SIZE-1][SIZE-1] );
return 0;
}
|
矩阵乘法例题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
static const int maxm=1e2+10;
#define REP(i,s,t) for(int i=s;i<=t;i++)
typedef long long LL;
struct matrix{
LL mtx[maxm][maxm];
}mx[16];
LL n,k,m;
LL A[maxm][maxm];
matrix mul(matrix A,matrix B){
matrix ret;
memset (ret.mtx,0, sizeof ret.mtx);
REP(i,1,n)REP(j,1,n)REP(k,1,n)
ret.mtx[i][j]=(ret.mtx[i][j]+A.mtx[i][k]*B.mtx[k][j]);
return ret;
}
matrix pow (matrix A,LL n){
if (!n) return A;
matrix ret=A;n--;
while (n){
if (n&1)ret=mul(ret,A);
A=mul(A,A);
n>>=1;
}
return ret;
}
void display(matrix base){
for ( int i=1;i<=n;i++) printf ( "%lld " ,base.mtx[1][i]);
puts ( "" );
}
int main(){
matrix st,get,f;
scanf ( "%lld%lld%lld" ,&n,&m,&k);
for ( int i=1;i<=m;i++){
for ( int j=1;j<=n;j++){
scanf ( "%lld" ,&A[i][j]);
mx[i].mtx[A[i][j]][j]=1;
}
}
for ( int i=1;i<=n;i++)st.mtx[1][i]=i;
get=mx[1];
for ( int i=2;i<=m;i++)get=mul(get,mx[i]);
get= pow (get,k/m);k%=m;
for ( int i=1;i<=k;i++)get=mul(get,mx[i]);
st=mul(st,get);
display(st);
return 0;
}
//by Exbilar
|
转载于:https://www.cnblogs.com/liuqifeng/p/11376791.html
2019年8月19日矩阵相关推荐
- 2019年10月19日星期六
2019年10月19日星期六 师院上课 颗粒归仓 纪老师教会我们学习了东西要及时总结,颗粒归仓的意思就是收获的粮食要放到仓库中(储存),知识也一样,学会以后需要把知识做收集总结起来. 今天我们进行了一 ...
- 【图片新闻】2019年6月19日伊朗击落一架美军MQ-4 Triton无人侦察机
伊朗消息人士和五角大楼称,2019年6月19日,伊朗击落了一架MQ-4 Triton侦察机.伊朗声称这架无人机正在伊朗领空飞行,但美国政府否认这一说法. MQ-4 Triton是一种无人驾驶.非致命的 ...
- 2019年6月19日 星期三 今日计划
2019年6月19日 星期三 今日计划 学习XMLHttpRequest对象
- 【蜕变之路】第29天 CAST和CONVERT的区别(2019年3月19日)
Hello,大家好!我是程序员阿飞!今天从北京来了位项目经理,很热情,中午的时候,就带我们出去吃了一顿,很感谢领导.我们主要学习一下SQL中 CAST和CONVERT的区别. 1.作用 两者都是用来获 ...
- 2019年6月19日Jerry Wang的SAP SAP Cloud Connector练习
https://webidetesting9070069-i042416trial.dispatcher.hanatrial.ondemand.com/ag3-backend/sap/opu/odat ...
- 2019年9月19日好货十元内精选包邮
复制这条信息,$H14ZYNhfI2g$,到[手机淘宝]即可查看 复制这条信息,$LmqTYNhlCUs$,到[手机淘宝]即可查看 复制这条信息,$yHt0YNhIbdT$,到[手机淘宝]即可查看 复 ...
- Win10 收件箱添加QQ邮箱(2019年5月19日)
Emmm弄的时候没截图,就语言描述吧,非常简单. 登录到网页端QQ邮箱.点我登录 登录之后,界面上端的Logo右边有个"设置"(字有点小).点它 邮箱设置下面有一堆标签,点击&qu ...
- 2019年1月19日假期日记
今天是第二天开始写代码,感觉其实还是没有那么好的状态,虽然是很简单的代码,到今天好像就卡死那个越界上了,交了好几遍,还是没有ac,感到很郁闷,虽然以后郁闷的时间还有很多,但是,也不能是这么简单的题吧. ...
- 2019年4月19日
本学期的第8周,主要学习了jQuery和自适应(如:媒体查询).其中jQuery中的AJAX是这两天才真正的学会的,jQuery中的插件只是了解了用法,没有深入的进行学习,自适应的媒体查询深入的学习了 ...
- 2019年1月19日假期训练日记
51nod上的题目是真多啊,我想跳着写都不知道该怎么跳?.做了几个打印图形的题,都用到了setw函数控制域宽,对于setw函数,含义看了好多遍,能理解什么意思,但做题就对不上号.幸亏我用的时候没有死抠 ...
最新文章
- Python3 命名规范
- 编程进阶,学会使用_I、_O、_IO,以及volatile const的意义
- 一个关于nvarchar字段排序,中英文混合排序的问题
- 在Win7中使用Python的MySQLdb模块
- pyemd资料学习 2019.1.24 https://media.readthedocs.org/pdf/pyemd/latest/pyemd.pdf
- jQuery的radio,checkbox,select操作
- [原创]Aster剧情介绍和简单评价
- 计算机科学与技术 双一流,26所双一流高校、18个省市,计算机科学与技术专业分数线汇总!...
- 分布式存储系统学习笔记(一)—什么是分布式系统(6)—2PC和Paxos协议
- linux设备驱动程序-i2c(1):i2c总线的添加与实现
- 稳定版本php源包下载,PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)20170501更新...
- CGB2202-DAY02-IO低级流与高级流
- word被锁定无法编辑怎么处理
- 商业银行管理(ROSE) 思维导图
- 基于html5+Java+MySQL的健身俱乐部网站设计与实现 文档+任务书+开题报告+答辩PPt+项目源码及数据库文件
- 麻辣隔壁的我的C币被盗了!?
- 开发者该如何抓住微信小游戏的风口?听Cocos创始人王哲详解(上篇)
- 华为5G基站日常维护操作手册(无线)
- 多态和接口(3)——设计模式(1)——方法override、CLR(Common Language Runtime 公共语言运行时)、CTS(Common Type System 公共语言系统)
- python 绘制封装函数绘制南海小地图
热门文章
- JNI学习-- C调用java方法
- strace的简单用法
- mysql查询4-6_MySQL学习(四)查询
- python中json模块_python中的json模块
- 数据库管理工具_NavicatPemium_入门使用
- “网友”叫你先上STM32,51是小朋友玩的,所以你就不学51了
- 数字电子技术基础第三版杨志忠_阎石《数字电子技术基础》(第6版)笔记和课后习题(含考研真题)详解复习笔记资料...
- 6.5使用外部环境的属性文件
- [渝粤教育] 江西财经大学 实用英语演讲 参考 资料
- matlab矩阵中每一行数除以一个数