Tag: 矩阵乘法

将两个矩阵乘以不同的维度

我正在编写一个乘法矩阵的应用程序。 这适用于nxn矩阵a和b的预期: for(k = 0; k < n; k++) { for(i = 0; i < n; i++) { tmp = a[i][k]; for(j = 0; j < n; j++) { c[i][j] = c[i][j] + tmp * b[k][j]; } } } 如果a是nxy且b是yxm(暗示c是nxm)。 如何修改上述循环才能工作? 谢谢

使用分而治之的方法的矩阵乘法

我是编程的初学者,刚刚学习了新的概念并开始编写矩阵乘法的代码,但我在指针和其他方面感到困惑所以我在这里上传代码以寻求指导。 #include #include int **matrixMultiply(int A[][8], int B[][8], int row); int main() { int **A = allocate_matrix(A, 8, 8); int **B = allocate_matrix(B, 8, 8); int i, j; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { A[i][j] = i + j; A[i][j] = i + […]

带散射集合的MPI矩阵乘法

我正在尝试使用C中的MPI进行矩阵乘法,我们必须做一个顺序和一个并行版本的版本。 我的并行版本没有给出正确的答案,我不知道为什么。 我想我没有向流程发送正确的通信,但我不能确定。 教授刚刚查看了不同的发送/接收/收集等消息,但没有真正详细介绍……我已经看到很多不同的例子,但没有完成,没有使用分散/聚集。 如果有人可以看看我的代码,并告诉我,如果有任何东西突然出现,我会很感激。 我很确定我的问题在于分散/收集消息或c矩阵的实际计算。 #define N 512 #include #include #include #include #include #include “mpi.h” print_results(char *prompt, float a[N][N]); int main(int argc, char *argv[]) { int i, j, k, rank, size, tag = 99, blksz, sum = 0; float a[N][N], b[N][N], c[N][N]; char *usage = “Usage: %s file\n”; FILE *fd; double elapsed_time, start_time, end_time; […]

使用SSE内在函数的大小为100 * 100的矩阵乘法

int MAX_DIM = 100; float a[MAX_DIM][MAX_DIM]__attribute__ ((aligned(16))); float b[MAX_DIM][MAX_DIM]__attribute__ ((aligned(16))); float d[MAX_DIM][MAX_DIM]__attribute__ ((aligned(16))); /* * I fill these arrays with some values */ for(int i=0;i<MAX_DIM;i+=1){ for(int j=0;j<MAX_DIM;j+=4){ for(int k=0;k<MAX_DIM;k+=4){ __m128 result = _mm_load_ps(&d[i][j]); __m128 a_line = _mm_load_ps(&a[i][k]); __m128 b_line0 = _mm_load_ps(&b[k][j+0]); __m128 b_line1 = _mm_loadu_ps(&b[k][j+1]); __m128 b_line2 = _mm_loadu_ps(&b[k][j+2]); __m128 b_line3 = _mm_loadu_ps(&b[k][j+3]); result = […]

OpenMP并行化(Block Matrix Mult)

我正在尝试实现块矩阵乘法并使其更加并行化。 这是我的代码: int i,j,jj,k,kk; float sum; int en = 4 * (2048/4); #pragma omp parallel for collapse(2) for(i=0;i<2048;i++) { for(j=0;j<2048;j++) { C[i][j]=0; } } for (kk=0;kk<en;kk+=4) { for(jj=0;jj<en;jj+=4) { for(i=0;i<2048;i++) { for(j=jj;j<jj+4;j++) { sum = C[i][j]; for(k=kk;k<kk+4;k++) { sum+=A[i][k]*B[k][j]; } C[i][j] = sum; } } } } 我一直在玩OpenMP,但是在找出在最短的时间内完成这项工作的最佳方法仍然没有运气。

使用fork()和IPC在C中进行最有效的矩阵乘法

我需要使用多个进程在C中实现并发矩阵乘法。 我理解,因为每个进程都有自己的私有地址空间,我将不得不使用某种forms的进程间通信(IPC)。 我做了一些环顾四周,找不到许多不使用线程的实现。 我想知道是否有人知道最好的方法,使用共享内存,消息传递或管道? 我不是要求解决方案,而是,如果有人知道,这些方法中的哪一种在矩阵乘法中会更有效。 或者,如果有一个通用的标准方法来执行多个流程?

pthread编程中的共享数据

在pthread编程中我仍然不太确定。 如果有人能告诉我一个绝对的答案,我将不胜感激。 我之前的问题是: 如何在简单的Pthread编程中分配数组变量? 现在,我正在研究矩阵乘法。 它使用这个很好用: typedef struct { int rowIdx; int (*matA)[SIZE], (*matB)[SIZE], (*matC)[SIZE]; } newType; int main (){ int matriksA[SIZE][SIZE]; int matriksB[SIZE][SIZE]; int matriksC[SIZE][SIZE]; for (i=0;i<NUM_THREAD;i++) { (*block).rowIdx = i; (*block).matA = matriksA; (*block).matB = matriksB; (*block).matC = matriksC; pthread_create(&arrThread[i], NULL, matrixMul, (void *)block); block++; } } void *matrixMul(void *x){ newType *p = […]

将两个2Darrays相乘

所以我有一个问题将两个2darrays相乘。 我非常确定矩阵A和矩阵B正确存储,它们在程序运行时正确显示。 当我尝试将2个数组相乘时,我得到了很多1和0的长字符串。 什么可能是问题的任何想法? 这是我的代码: #include #include #include #include /* Routines called. */ int loadMatrixFromFile(char *filename, int *data); void showMatrix(int *data, int len); int makeIdent(int matrixB[5][5], int length); int matrixA[5][5]; int matrixB[5][5]; int matrixC[5][5]; void multiplyMatrices(int matrixA[5][5], int matrixB[5][5],int matrixC[5][5]); int main(){ int len, data[1000]; len = loadMatrixFromFile(“Numbers.txt”, data); showMatrix(data, len); makeIdent(matrixB,len); multiplyMatrices(matrixA, matrixB, matrixC); […]

如何使用尺寸未知的2D数组?

我正在为矩阵乘法编写C函数。 它需要两个二维2D数组。 如果我知道输入数组的大小,我可以这样做,但我想做一个更通用的function。 如何在编译时不知道产品的尺寸时如何找到它们的尺寸以及如何返回数组?

OpenCV:用C ++和C乘以图像

我刚刚使用了C api(cvMul)和C ++ api(mul和multiply)的乘法函数。 但是我从C函数和C ++函数得到了不同的结果 cvMul的结果 (白色图像) mul和multiply的结果 这是我用于两种实现的代码: C IplImage * gh = cvCreateImage(cvGetSize(input),IPL_DEPTH_32F,1) ; cvSobel(input,gh,1,0) ; IplImage * gh2 = cvCreateImage(cvGetSize(input),IPL_DEPTH_32F,1) ; cvMul(gh,gh,gh2) ; C ++ Mat gh = Mat (input.size(), CV_32FC1); Sobel(input, gh, CV_32FC1, 1, 0); Mat gh2 = Mat (input.size(), CV_32FC1); gh2 = gh.mul(gh); // multiply (gh, gh, gh2); 输入图像是相同的,当我检查水平渐变时,它们对于两种实现也是相同的,那么为什么乘法会得到不同的结果呢? […]