标签: matrix-multiplication

使用matmul将数组的一部分乘以矩阵

我的问题类似于这个与3D矩阵相乘的3D矩阵.但是,我在Fortran中编码.

再说了,如果我有一个RxSxT矩阵ASxU矩阵B,其中R,S,T,U是整数,我要乘A(:,:,0)B.我怎么能这样做matmul?当我做的事情

    C(:,:,0) = matmul(A(:,:,0),B)
Run Code Online (Sandbox Code Playgroud)

编译器(gfortran)给出:

    Warning:Array reference at (1) is out of bounds (0 < 1) in dimension 3 
    f951: internal compiler error: Segmentation fault
Run Code Online (Sandbox Code Playgroud)

有没有解决的办法?谢谢.

编辑:我应该补充一点,我实际上是转置第二个矩阵.再说了,A一个RxSxT矩阵和B一个UxS矩阵.然后

 C(:,:,0) = matmul(B,transpose(A(:,:,0))
Run Code Online (Sandbox Code Playgroud)

转置可能是问题的一部分.它将A(i,j,k)转换为A(k,i,j)吗?

fortran matrix matrix-multiplication

1
推荐指数
1
解决办法
1283
查看次数

如何在Matlab中复制矩阵的所有内部列和总和列对

假设我有一个矩阵 A

 1     2     3     4     5
 1     2     3     4     5
 1     2     3     4     5
 1     2     3     4     5
 1     2     3     4     5
Run Code Online (Sandbox Code Playgroud)

如何复制内部A以获取新矩阵B

 1     2     2     3     3     4     4     5
 1     2     2     3     3     4     4     5
 1     2     2     3     3     4     4     5
 1     2     2     3     3     4     4     5
 1     2     2     3     3     4     4     5
Run Code Online (Sandbox Code Playgroud)

请注意,第一列和最后一列A是独立的.然后我需要将行对相加以获得另一个矩阵C:

 3     5 …
Run Code Online (Sandbox Code Playgroud)

matlab matrix matrix-multiplication

1
推荐指数
1
解决办法
79
查看次数

numpy.dot(a,b)给出了具有相似维数的矩阵乘法的错误结果

令矩阵a,b为[1,2,3,4],即(1×4)维.
在应用numpy.dot(a,b)时,结果为30而不是引发异常,即两个矩阵形状都没有对齐.
(mxn)矩阵如何与(mxn)矩阵相乘?numpy会自动转换一个矩阵来对齐它们的形状然后相乘吗?

python numpy matrix matrix-multiplication

1
推荐指数
1
解决办法
3370
查看次数

如何判断A*B是Numpy中的Hadamard还是Dot产品?

如果我在导入numpy的python代码中看到以下行:

c = a * b
Run Code Online (Sandbox Code Playgroud)

确定此操作是作为Hadamard(元素方向)还是点积(逐点)操作执行的最简单,最实用的方法是什么?

对于Hadamard产品来说,A和B的列和行大小必须相同.对于点积,只有A的列大小必须与B的行大小相同,对吗?所以我可以查找两者的形状并找出使用的操作?

python numpy linear-algebra matrix-multiplication dot-product

1
推荐指数
1
解决办法
3266
查看次数

使用SSE的矩阵向量和矩阵 - 矩阵乘法

我需要编写矩阵向量和矩阵乘法函数,但我无法绕过SSE命令.

矩阵和向量的维数总是4的倍数.

我设法编写了矢量矢量乘法函数,如下所示:

void vector_multiplication_SSE(float* m, float* n, float* result, unsigned const int size)
{
    int i;

    __declspec(align(16))__m128 *p_m = (__m128*)m;
    __declspec(align(16))__m128 *p_n = (__m128*)n;
    __declspec(align(16))__m128 *p_result = (__m128*)result;

    for (i = 0; i < size / 4; ++i)
        p_result[i] = _mm_mul_ps(p_m[i], p_n[i]);

    // print the result
    for (int i = 0; i < size; ++i)
    {
        if (i % 4 == 0) cout << endl;
        cout << result[i] << '\t';
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试实现矩阵向量乘法.

这是我到目前为止所拥有的:

void multiply_matrix_by_vector_SSE(float* m, float* v, …
Run Code Online (Sandbox Code Playgroud)

c++ sse intrinsics matrix-multiplication vector-multiplication

1
推荐指数
1
解决办法
2338
查看次数

Julia矩阵乘法比numpy慢

我试图在Julia中进行一些矩阵乘法,以便将其与numpy进行对比.

我的Julia代码如下:

function myFunc()
  A = randn(10000, 10000)
  B = randn(10000, 10000)
  return A*B
end

myFunc()
Run Code Online (Sandbox Code Playgroud)

而python版本是:

A = np.random.rand(10000,10000)
B = np.random.rand(10000,10000)
A*B
Run Code Online (Sandbox Code Playgroud)

Python版本需要不到100毫秒才能执行.Julia版本需要超过13秒!看到他们在引擎盖下使用几乎相同的BLAS技术,似乎是Julia版本的问题?!

python numpy blas matrix-multiplication julia

1
推荐指数
2
解决办法
800
查看次数

犰狳与Eigen3时间差异

我希望这个讨论可以帮助其他任何与Armadillo和Eigen3有关的人.

我编写了一个包装类Mat,它包含来自armadillo库的arma :: Mat或来自Eigen3库的Eigen :: Matrix.这在编译时用标志控制.

另外,我写了一个使用Mat作为存储的Tensor类.此类的主要特征是使用Voigt表示法来压缩高阶张量,以便正确存储在矩阵中.

最后,我编写了一个多次乘以二阶张量(即矩阵)和一阶张量(即矢量)的测试,并记录完成运算符所需的时间.我用Mat类和Tensor类来做这个.

因为Tensor包裹Mat,我希望它的时间更长.犰狳就是这种情况,平均接近20%.然而,当使用Eigen时,使用Tensor更快,这对我来说绝对没有意义.

有什么事情适合任何人吗?

编辑:提供更多细节.

我首先将arma :: Mat包装成myOwn :: armaMat,将Eigen :: Matrix包装到myOwn :: eigenMat中.这两个都只是将armadillo和Eigen的API包装到一个通用框架中.最后,基于编译器标志,myOwn :: Mat包装了一个armaMat或一个eigenMat.我不确定我们打开的任何优化标志.

如上所述,myOwn :: Tensor使用myOwn :: Mat作为存储.由于我将使用Tensor类的物理应用程序,它被模板化为2D(即如果是2阶的2乘2)或3D(即3乘3).(相比之下,垫可以是任何尺寸).

我用于定时目的的运算符是:2乘2矩阵(二阶张量)乘以2乘1矩阵(一阶张量).当只使用Mat时,我基本上使用的是犰狳或Eigen的表达式模板.

使用我的Tensor类时,我正在重载operator*:

template< typename T1, bool Sym >
moris::Mat< T1 >
operator*(
        moris::Tensor< T1, 2, 2, true > const & aTensor1,
        moris::Tensor< T1, 1, 2, Sym >  const & aTensor2 )
{

    moris::Mat< T1 > tVector(2, 1);

    tVector(0) = aTensor1[0]*aTensor2[0] + aTensor1[2]*aTensor2[1];
    tVector(1) = aTensor1[2]*aTensor2[0] + aTensor1[1]*aTensor2[1];

    return tVector;
}
Run Code Online (Sandbox Code Playgroud)

Tensor上的[]运算符从底层存储Mat访问数据(通过Voigt约定).

timing matrix-multiplication armadillo eigen3

1
推荐指数
1
解决办法
1601
查看次数

使用RcppArmadillo进行矩阵乘法:为什么它不会更快?

我试图用RcppArmadillo做一些矩阵乘法.但是,我的代码显示RcppArmadillo不会变得更快.

我使用Windows_10_Pro和R 3.2.4,以及RcppArmadillo 0.6.600.4.0

例如:

library(RcppArmadillo)
library(inline)

MCplus <- cxxfunction(signature(X_="numeric", Y_="numeric"),body ='
arma::mat X = Rcpp::as<arma::mat>(X_);
arma::mat Y = Rcpp::as<arma::mat>(Y_);
arma::mat ans = X * Y * X;
return(wrap(ans));
', plugin="RcppArmadillo")

A <- matrix(1:16000000,4000,4000)
C <- matrix(2:16000001,4000,4000)

R_M <- proc.time()
ans_R <- A%*%C%*%A # test with R
proc.time() - R_M

C_M <- proc.time()
ans_C <- MCplus(A,C) # test with RcppArmadillo
proc.time() - C_M
Run Code Online (Sandbox Code Playgroud)

R输出:

user  system elapsed
106.75   0.24 106.98
Run Code Online (Sandbox Code Playgroud)

而RcppArmadillo输出:

user  system elapsed
108.28   0.23 108.56 
Run Code Online (Sandbox Code Playgroud)

有什么东西可以改善吗? …

r matrix-multiplication rcpp

1
推荐指数
1
解决办法
1542
查看次数

在R中,比循环或应用更快的方式

对于这两个矩阵,我想找到矩阵X和Q行的乘积,并应用ifelse函数来查看产品是否大于零.

n1=1000, m=10000
X=cbind(rnorm(n1),rbinom(n1))
Q=matrix(rnorm(2*m), ncol=2)
Run Code Online (Sandbox Code Playgroud)

为此,我尝试了循环并应用以下功能.

D=10000
ind_beta=matrix(0,n1,D)
for (l in 1:D){
ind[,l]=as.vector(ifelse(X%*%Q[l,]>=0,1,0))   
}
Run Code Online (Sandbox Code Playgroud)

ind=apply(Q,1,function(x){ifelse(X%*%Q>=0,1,0)})
Run Code Online (Sandbox Code Playgroud)

两个代码都给出了相同的结果,但实际上非常耗时.有没有办法让这个快?提前致谢.

for-loop r matrix apply matrix-multiplication

1
推荐指数
1
解决办法
741
查看次数

矩阵乘法:在CUDA中合并全局内存访问后性能下降

我最近开始使用CUDA开始使用GPU.作为入门程序,我试图有效地实现简单的矩阵乘法

C = AB

,从朴素矩阵乘法开始(每个线程加载C中元素的A和B的所有元素),平铺实现(线程协同加载来自共享内存中的块中A和B的元素块以减少全局内存交通)提供良好的加速.但是,在平铺实现中,对全局内存的访问也不是合并的顺序.因此,为了提高性能,最好转置矩阵B然后相乘.以下是我的代码,

#include<stdio.h>
#include<stdlib.h>
#include<cuda_runtime.h>

#include <time.h>

#include <sys/time.h>


void querydeviceprop();
void allocate_matrix(float *h_a, float *h_b, int matDim);
void verify(float *h_c, float *h_c_check, int matDim);
void print_matrix(float *ha, int m,int n);
void transpose_matrix(float *ha, int matDim);

void mat_mul();

#define TILE_WIDTH 16 //should be equal to numThread for tiling implementation

__global__ void MatrixMult_tiling(float *d_a,float *d_b,float *d_c, int dim){

    __shared__ float ta[TILE_WIDTH][TILE_WIDTH]; //to load one tile of A
    __shared__ float tb[TILE_WIDTH][TILE_WIDTH]; //to load one tile of A
    int bx,by,tx,ty,i,j; …
Run Code Online (Sandbox Code Playgroud)

parallel-processing cuda gpu matrix-multiplication

1
推荐指数
1
解决办法
524
查看次数