cblas中矩阵相乘是矩阵元素相乘乘再相加吗

苹果/安卓/wp
积分 275, 距离下一级还需 175 积分
权限: 自定义头衔, 签名中使用图片
道具: 彩虹炫, 涂鸦板, 雷达卡, 热点灯, 金钱卡, 显身卡, 匿名卡下一级可获得
道具: 抢沙发
购买后可立即获得
权限: 隐身
道具: 金钱卡, 彩虹炫, 雷达卡, 热点灯, 涂鸦板
两个矩阵点对点相乘 (比如3X3的)。
但是其中一个矩阵的元素是list, 有点像是一个三维数组。 但是我想得到的结果也还是同大小的矩阵,而且每个元素也还是一个list.
有高手知道知道怎么操作吗?
Code是怎么写呢?
matrix(lapply(1:length(A), function(i) A*B[]), nrow=nrow(A), ncol=ncol(A))
载入中......
matrix(lapply(1:length(A), function(i) A[i]*B[[i]]), nrow=nrow(A), ncol=ncol(A))
总评分:&学术水平 + 1&
热心指数 + 1&
信用等级 + 1&
没明白问题
缺少币币的网友请访问有奖回帖集合:
http://bbs.pinggu.org/thread--1.html
& && &3, 4
& && &E, F
但是C, D, E, F 每个元素不是一个单一数字,而是一个list, 比如 C= 5,6,7,8 等 
让矩阵A和B的每个元素对应相乘,1xC, 2XD... 其实C,D等 被乘的又是它包含的每一个元素(数字)。最后得到一个新的含有list 元素的2X2矩阵H。
& && &Z, K
X,Y ,Z,K 等又是一个个的list.
H 是我想要的结果 
function(x,y) list(A[x,y]*unlist(B[x,y]))复制代码大概是这样子吧,然后再matrix一下&&暂时没完全弄出来 ,明再看下,大过年的还在忙呢你们
不知道是不是你的意思
总评分:&学术水平 + 1&
热心指数 + 1&
信用等级 + 1&
是什么给了你自信
都回家过年了吗?
问题再具体一点 
A &- matrix(c(1,2,3,4), nrow=2, ncol=2)
C &- c(1,2,3)
D &- c(2,3,4)
E &- c(3,4,5)
F &- c(4,5,6)
B &- matrix(list(C,D,E,F), nrow=2, ncol=2)
yywan0913 发表于
大概是这样子吧,然后再matrix一下&&暂时没完全弄出来 ,明再看下,大过年的还在忙呢你们
不知道是不是你的 ...多谢了,在国外还得悲催的上班啊 
我读你的代码 感觉应该可以的 是我的意思。但是我试了一下 估计是我哪里写错了。
& A &- matrix(c(1,2,3,4), nrow=2, ncol=2)
& &&&[,1] [,2]
[1,]& & 1& & 3
[2,]& & 2& & 4
& C &- c(1,2,3)
& D &- c(2,3,4)
& E &- c(3,4,5)
& F &- c(4,5,6)
& B &- matrix(list(C,D,E,F), nrow=2, ncol=2)
& &&&[,1]& && &[,2]& &&&
[1,] Numeric,3 Numeric,3
[2,] Numeric,3 Numeric,3
& H &- matrix(function(x,y) list(A[x,y]*unlist(B[x,y])),nrow=nrow(A), ncol=ncol(A))
Error in as.vector(x, mode) :
&&cannot coerce type 'closure' to vector of type 'any'
Error: object 'H' not found
ntsean 发表于
matrix(lapply(1:length(A), function(i) A*B[]), nrow=nrow(A), ncol=ncol(A))多谢大神!用你的代码可以实现!
就是有些不是很理解 A*B[] 这个部分,按道理应该是表达A的每个元素乘以B的每个对应元素。
B[] 怎么解释呢?
真的感谢大家在大年三十的时间 还在帮我解答问题。
sty1882 发表于
多谢了,在国外还得悲催的上班啊 
我读你的代码 感觉应该可以的 是我的意思。但是我试了一下 估计是 ...f=function(x,y) list(A[x,y]*unlist(B[x,y]))
matrix(c(f(1,1),f(1,2),f(2,1),f(2,2)),nrow=2)复制代码
总评分:&学术水平 + 1&
热心指数 + 1&
信用等级 + 1&
是什么给了你自信
初级学术勋章
初级学术勋章
初级热心勋章
初级热心勋章
初级信用勋章
初级信用勋章
中级信用勋章
中级信用勋章
中级学术勋章
中级学术勋章
中级热心勋章
中级热心勋章
高级热心勋章
高级热心勋章
高级学术勋章
高级学术勋章
高级信用勋章
高级信用勋章
特级热心勋章
高级热心勋章
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
论坛法律顾问:王进律师21032人阅读
MathTool(2)
CBLAS的安装与使用
烤鱼片(@eii.dlmu)
CBLAS是BLAS的C语言接口。BLAS的全称是Basic Linear Algebra Subprograms,中文大概可以叫做基础线性代数子程序。主要是用于向量和矩阵计算的高性能数学库。本身BLAS是用Fortran写的,为了方便C/C++程序的使用,就有了BLAS的C接口库CBLAS。BLAS的主页是http://www.netlib.org/blas/,CBLAS的下载地址也可以在这个页面上找到。
CBLAS安装需要先装BLAS,从主页上下载blas.tgz,解压,根据系统修改make.inc和Makefile,make,就会生成一个blas_LINUX.a文件。然后,下载cblas.tgz,解压,在目录下将Makefile.*文件改名或者做一个链接文件为Makefile.in文件,比如在linux下就是ln -s Makefile.LINUX Makefile.in,根据具体情况修改Makefile.in文件,主要是BLAS的库文件路径BLLIB和CBLAS的安装目录CBDIR,make help就可以打印出可以使用的make命令,要生成全部文件就是用make all。在$(CBDIR)目录下的$(CBLIBDIR)将生成CBLAS的库文件$(CBLIB),cblas_LINUX.a。
在CBLAS的安装目录$(CBDIR)下的src目录中有个cblas.h是包括的CBLAS的函数和常量的头文件,使用CBLAS的时候就需要这个头文件,同时还需要BLAS的库文件$(BLLIB )和CBLAS的库文件$(CBLIB)。
CBLAS/BLAS分为3个level,level1是用于向量的计算,level2是用于向量和矩阵之间的计算,level3是矩阵之间的计算。比如计算矩阵的乘法就是属于level3,这里就用矩阵乘法来学习使用CBLAS。
计算矩阵乘法的函数之一是 cblas_sgemm,使用单精度实数,另外还有对应双精度实数,单精度复数和双精度复数的函数。在此以 cblas_sgemm为例。
函数定义为:
void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
&&&&&&&&&&&&&&&& const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
&&&&&&&&&&&&&&&& const int K, const float alpha, const float&*A,
&&&&&&&&&&&&&&&& const int lda, const float&*B, const int ldb,
&&&&&&&&&&&&&&&& const float beta, float&*C, const int ldc)
关于此详细定义可以在http://www.netlib.org/blas/sgemm.f找到,只不过是fortran语言的,这个C语言版的略有差别。
此函数计算的是 C = alpha*op( A )*op( B ) + beta*C,
const enum CBLAS_ORDER Order,这是指的数据的存储形式,在CBLAS的函数中无论一维还是二维数据都是用一维数组存储,这就要涉及是行主序还是列主序,在C语言中数组是用行主序,fortran中是列主序。我还是习惯于是用行主序,所以这个参数是用CblasRowMajor,如果是列主序的话就是CblasColMajor。
const enum CBLAS_TRANSPOSE TransA和&&&&&&&&&&&&&&&& const enum CBLAS_TRANSPOSE TransB,这两个参数影响的是op( A )和op( B),可选参数为CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113,其中TransA = CblasNoTrans,&op( A ) = A,TransA = CblasTrans,&op( A ) = A',TransA = CblasConjTrans,&op( A ) = A'。 TransB类似。
const int M,矩阵A的行,矩阵C的行
const int N,矩阵B的列,矩阵C的列
const int K,矩阵A的列,矩阵B的行
const float alpha, const float beta,计算公式中的两个参数值,如果只是计算C=A*B,则alpha=1,beta=0
const float&*A, const float&*B, const float&*C,矩阵ABC的数据
const int lda, const int ldb, const int ldc,在BLAS的文档里,这三个参数分别为ABC的行数,但是实际使用发现,在CBLAS里应该是列数。
我在这里计算两个简单矩阵的乘法。
程序代码:
//因为程序是C++,而CBLAS是C语言写的,所以在此处用extern关键字
&&& #include&cblas.h&&&
#include&iostream&
using namespace
int main(void) {
&&& const enum CBLAS_ORDER Order=CblasRowM
&&& const enum CBLAS_TRANSPOSE TransA=CblasNoT
&&& const enum CBLAS_TRANSPOSE TransB=CblasNoT
&&& const int M=4;//A的行数,C的行数
&&& const int N=2;//B的列数,C的列数
&&& const int K=3;//A的列数,B的行数
&&& const float alpha=1;
&&& const float beta=0;
&&& const int lda=K;//A的列
&&& const int ldb=N;//B的列
&&& const int ldc=N;//C的列
&&& const float A[K*M]={1,2,3,4,5,6,7,8,9,8,7,6};
&&& const float B[K*N]={5,4,3,2,1,0};
&&& float C[M*N];
&&& cblas_sgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
&&& for(int i=0;i&M;i++)
&&&&&& for(int j=0;j&N;j++)
&&&&&&&&&& cout&&C[i*N+j]&&&/t&;
&&&&&& cout&&endl;
&&& return EXIT_SUCCESS;
在编译的时候需要带上cblas_LINUX.a和blas_LINUX.a,比如,
g++ main.cpp cblas_LINUX.a blas_LINUX.a -o main
当然,这里假定是这两个.a文件是放在可以直接访问的位置,或者写全路径也可以。
这种做法在CentOS.5下顺利通过,但是在我的Ubuntu.7.10下出了问题,blas_LINUX.a正常编译生成,但在链接的时候出了错误,所以只好从源里安装了atlas,sudo apt-get install atlas3-base,在/usr/lib/atlas/目录下就会有libblas.*和liblapack.*库文件,只需要在链接的时候用这里的blas库文件替换上文安装的BLAS就可以正常编译通过。
另外,在GSL下也有BLAS和CBLAS,在boost里有ublas也提供CBLAS/BLAS的功能,有时间也拿来研究研究。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:91224次
排名:千里之外
原创:12篇
评论:22条
(1)(2)(3)(2)(4)(3)一个关于线性代数矩阵相乘的问题【数学吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:424,292贴子:
一个关于线性代数矩阵相乘的问题收藏
书上说用下面的矩阵来表达“信息位”和“监督位”那里的那7个等式组成的方程组。问题是矩阵相乘时,对应元素相乘后是相加的可上面的方程组中的数是“异或”的关系,怎么能用矩阵乘法来表示呢?比如矩阵C的第4个元素,用矩阵乘法算的话应该是u2+u0,而不是上面方程组中的c3=u2异或u0。
登录百度帐号推荐应用}

我要回帖

更多关于 两个矩阵对应元素相乘 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信