矩阵乘法

PTAL1-048 矩阵A乘以B(15 分)坑点分析

匿名 (未验证) 提交于 2019-12-03 00:29:01
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra行、Ca列,B有Rb行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。 输入格式: 输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。 输出格式: 若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出“Error: Ca != Rb”,其中Ca是A的列数,Rb是B的行数。 输入样例1: 2 3 1 2 3 4 5 6 3 4 7 8 9 0 -1 -2 -3 -4 5 6 7 8 输出样例1: 2 4 20 22 24 16 53 58 63 28 输入样例2: 3 2 38 26 43 -5 0 17 3 2 -11 57 99 68 81 72 输出样例2: Error: 2 != 3 此题没什么难度,就是考察矩阵乘法的原理,在草稿纸上把原理写清晰了上机实现一般没有什么问题。但是会有一个坑点,本人做此题花了40min不到提交,还是有一个点没过。这个点就是: 否则输出“Error: Ca != Rb”,本人输出的时候直接输出Error: Ca != Rb了,殊不知应该输出Ca和Rb。。。

操作系统实验――矩阵乘法

匿名 (未验证) 提交于 2019-12-03 00:29:01
在windows操作系统上,利用Windows API编写程序用多线程实现矩阵乘法。实现A、B两个矩阵的乘法,并输出计算结果。 该实验相对比较简单,可先看实验报告的实验步骤,然后需要了解一下几个关于pthread里的函数使用: (1)pthread_join函数: 函数pthread_join用来等待一个线程的结束。 函数定义: int pthread_join(pthread_t thread, void **retval); 描述 : pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。 参数 : thread: 线程标识符,即线程ID,标识唯一线程。 retval: 用户定义的指针,用来存储被等待线程的返回值。 返回值 : 0代表成功。 失败,返回的则是错误号。 看下面一段程序: #include <pthread.h> #include <unistd.h> #include <stdio.h> void *thread (void *str ) { int i; for (i = 0 ; i < 10 ; ++i) { sleep ( 2 ); printf ( "This in the thread : %d \n"

线性代数基础

匿名 (未验证) 提交于 2019-12-03 00:26:01
一、 矩阵 矩阵元素 向量 矩阵向量相乘与数组运算 两个矩阵相乘 矩阵乘法方法: 特殊的矩阵运算 1、 矩阵的逆 2、 转置矩阵 文章来源: 线性代数基础

kaldi中特征变换

匿名 (未验证) 提交于 2019-12-03 00:22:01
简介 Kaldi 目前支持多种特征和模型空间的变换与映射。特征空间变换和映射通过工具来处理(本质上就是矩阵),以下章节将介绍: 全局线性或仿射变换 说话人无关或单一说话人( per-speaker )或者( per-utterance )单一句子自适应 句子-说话人( Utterance-to-speaker )和说话人-句子( speaker-to-utterance )映射 组合变换 估计变换时的静音权重 变换,投影或者其他没有特定说话人的特征操作包括: 线性判别性分析(LDA) 帧拼接和差分特征计算 异方差的线性判别性分析(HLDA) 全局半协方差/最大似然线性变换 全局变换主要通过说话人自适应的方式应用: 全局GMLLR/fMLLR变换 线性声道长度归一化 指数变换 谱均值和方差归一化 下面我们将介绍回归树以及用到回归树的变换: 为自适应构建回归类树 全局线性或仿射特征变换 Matrix<BaseFloat> The Tableconcept )中。 变换可以通过程序transform-feats应用于特征上,语法如下 Specifying Tableformats: wspecifiers and rspecifiers Extendedfilenames: rxfilenames and wxfilenames ).这个程序通常用于管道的一部分。

mul函数

匿名 (未验证) 提交于 2019-12-03 00:22:01
基本信息 mul函数 Unity3d 中,若是OpenGL,用的应该是GLSL,mul方法是(M,V)。 矩阵 内置的矩阵(float4x4): 名称 说明 UNITY_MATRIX_MVP 当前模型视图投影矩阵 UNITY_MATRIX_MV 当前模型视图矩阵 UNITY_MATRIX_V 当前视图矩阵 UNITY_MATRIX_P 当前的投影矩阵 UNITY_MATRIX_VP 当前视图投影矩阵 UNITY_MATRIX_T_MV 模型视图矩阵的转置 UNITY_MATRIX_IT_MV 模型视图矩阵的逆转置 _Object2World 当前模型矩阵 _World2Object 当前世界矩阵的逆矩阵 这里要特别说明一下UnityObjectToClipPos(v.vertex)) 方法, 官方网站 上说明,在写Instanced Shader时,通常情况下并不用在意顶点空间转换,因为所有内建的矩阵名字在Instanced Shader中都是被重定义过的,如果直接使用UNITY_MATRIX_MVP,会引入一个额外的矩阵乘法运算,所以推荐使用UnityObjectToClipPos / UnityObjectToViewPos函数,它们会把这一次额外的矩阵乘法优化为向量-矩阵乘法。 相机 名称 类型 数值 _WorldSpaceCameraPos float3 世界空间相机的位置

基础篇 | 15 C++ 科学计算 - OpenBLAS的安装与使用

匿名 (未验证) 提交于 2019-12-03 00:22:01
类似于Anaconda里面的numpy,C++里面也有类似的矩阵运算库,称之为BLAS(Basic Linear Algebra Subprograms):基础线性代数子程序库。 支持的数据类型有: 单精度浮点数(float) 双精度浮点数(double) 单精度负数 双精度负数 在机器学习里面一般我们只用float类型,很少使用double,考虑到性能,我们认为float的精度已经够了,而且速度快。 还有一个更高级的叫LAPACK,现在我们常用的BLAS其实就是LAPACK里面的一部分。 BLAS支持对子程序的封装,其实就是子函数了,它的子程序分类: Level1: 标量操作、向量操作、向量-向量操作 Level2:矩阵-向量操作 Level3: 矩阵-矩阵操作 BLAS:标准实现(Fortran) CBLAS:C的BLAS标准实现 Atlas:一种优化实现 GotoBLAS:多线程性能良好的优化实现(已停止更新) OpenBLAS:目前性能最好的开源实现,基于GotoBLAS MKL:Intel实现,在Intel处理器上性能最佳 各种BLAS实现的优劣对比 市面上的BLAS实现非常多,最早是用Fortran。 CBLAS是C的BLAS标准实现,但是这种实现有个缺点,速度非常慢。 Atlas:比C要好,但不够好。比如腾讯QQ空间有一个功能,就是标脸框那个程序,怎么做呢

行逻辑三元组稀疏矩阵加减乘的编程实现

匿名 (未验证) 提交于 2019-12-03 00:22:01
目的: 编程实现稀疏矩阵的四则运算。 实现: 1. 稀疏矩阵的存储结构采用行逻辑表示的三元组 2. # define MAXSIZE 12500 # define MAXRC 12500 typedef struct { int i , j ; int e ; } Triple ; typedef struct { Triple data [ MAXSIZE + 1 ]; int rpos [ MAXRC + 1 ]; int mu , nu , tu ; } RLSMatrix ; 先通过创建mu nu tu的值再根据这些值采用循环输入得到data,之后再通过扫描确定rpos的值则可以完成创建。 通过三元组的形式将非零元对应的行列以及数值存储下来,再由稀疏矩阵结构存下矩阵的行数列数以及非零元个数,即可囊括稀疏矩阵的所有信息。这样就可以以三元组的形式把矩阵非零元素存储下来,节省了存储量的同时便于矩阵运算。 矩阵的加法 根据矩阵的相关知识,两个矩阵相加要求两个矩阵的行数,列数要相等。故需要设置判断是否满足矩阵相加的条件。若满足条件,则进行加法运算。根据矩阵加法法则,得到的新矩阵拥有与原来两矩阵相同的行数和列数,其元素数值则为两矩阵对应位置的元素值之和。 矩阵的减法 和加法相同地根据三种情况采用三个循环处理对应的数据,只不过两个都有的情况结果要变为两者之差

caffe中的矩阵运算函数caffe_cpu_gemm,cblas_sgemm等解析

匿名 (未验证) 提交于 2019-12-03 00:22:01
caffe中最典型且常用的卷积运算,是通过将卷积操作转化成矩阵乘法来实现的,因此,卷积层的一系列程序实际上就是在为矩阵的卷积式展开和矩阵乘法函数做准备,caffe_cpu_gemm也就是在调用矩阵乘法函数cblas_sgemm。 1.矩阵间乘法: 这里我们先来看一下这些矩阵乘法函数有输入需求,以单精度矩阵乘法函数cblas_sgemm为例: cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, A的列数, B, B的列数, beta, C, C的列数) 比如base_conv_layer.cpp中的forward_cpu_gemm: caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, conv_out_channels_ /group_, conv_out_spatial_dim_, kernel_dim_, (Dtype)1. , weights + weight_offset_ * g , col_buff + col_offset_ * g , (Dtype)0. , output + output_offset_ * g ); caffe中caffe_cpu_gemm为: template<> void caffe_cpu_gemm

matlab_bug记录

匿名 (未验证) 提交于 2019-12-03 00:21:02
第一个bug: clear all clc image = imread('mm.jpg'); R_image = image(:,:,1); G_image = image(:,:,2); B_image = image(:,:,3); [n,~] = size(R_image); %直接用 rand 或 randn 产生矩阵,得到的矩阵是可逆矩阵的概率为1. %为了防止这种随机矩阵在数值上接近奇异性,为此我将他转换为正定矩阵 a = 1; % a 取任意正数 A = rand(n); A = A'*A+a*eye(n); R_image_key = A * R_image; G_image_key = A * G_image; B_image_key = A * B_image; image_key = cat(3,R_image_key,G_image_key,B_image_key); %image_key = uint8(image_key); imshow(image_key); 运行程序后:会出现这样的bug 好吧,2016a的报错还是很人性化的。(我在机房用的2015b,它直接给我报错矩阵维度不一样。。。气死我了,都让我感觉到自己学到了假的高等代数)。其实吧,问题的不在于数学,因为:矩阵维度已经符合矩阵乘法的规定了。问题的数据类型不一致。所以不能进行矩阵乘法

矩阵的基本运算

匿名 (未验证) 提交于 2019-12-03 00:21:02
一、矩阵的加法与减法    1、运算规则   设矩阵 , ,   则         简言之,两个矩阵相加减,即它们相同位置的元素相加减!    注意: 只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的.   2、 运算性质 (假设运算都是可行的)   满足交换律和结合律   交换律  ;   结合律  . 二、矩阵与数的乘法   1、 运算规则    数 乘矩阵A,就是将数 乘矩阵A中的每一个元素,记为 或 .   特别地,称 称为 的负矩阵.   2、 运算性质   满足结合律和分配律   结合律: (λμ)A=λ(μA) ; (λ+μ)A =λA+μA .   分配律: λ (A+B)=λA+λB .    典型例题    例6.5.1  已知两个矩阵   满足矩阵方程 ,求未知矩阵 .    解  由已知条件知      三、矩阵与矩阵的乘法   1、 运算规则   设 , ,则A与B的乘积 是这样一个矩阵:   (1) 行数与(左矩阵)A相同,列数与(右矩阵)B相同,即 .   (2) C的第 行第 列的元素 由A的第 行元素与B的第 列元素对应相乘,再取乘积之和.    典型例题    例6.5.2  设矩阵   计算    解   是 的矩阵.设它为              想一想 :设列矩阵 ,行矩阵 , 和