C程序中的矩阵乘法和归一化
矩阵乘法
现在讨论矩阵乘法的过程。如果满足特定条件,则只能执行矩阵乘法。假设两个矩阵分别是P和Q,并且它们的维度分别是P(axb)和Q(zxy),则当且仅当b=x时,才能找到所得矩阵。然后,所得矩阵R的阶数将为(mxq)。
算法
matrixMultiply(P, Q):
Assume dimension of P is (a x b), dimension of Q is (z x y)
Begin
if b is not same as z, then exit
otherwise define R matrix as (a x y)
for i in range 0 to a - 1, do
for j in range 0 to y – 1, do
for k in range 0 to z, do
R[i, j] = R[i, j] + (P[i, k] * Q[k, j])
done
done
done
End矩阵归一化
Suppose we have a 2x3 matrix: 4 5 6 1 2 3 The normalized matrix would be: 4/sqrt(pow(5,2) + pow(6,2)) 5/sqrt(pow(5,2) + pow(6,2)) 6/sqrt(pow(5,2) + pow(6,2)) 1/sqrt(pow(2,2) + pow(3,2)) 2/sqrt(pow(2,2) + pow(3,2)) 3/sqrt(pow(2,2) + pow(3,2))
示例
#include <stdio.h>
#include <math.h>
int main() {
int row, col, row1, col1;
int assignMatrix[50][50], rowAdd[100] = {0};
long long int a, square[50] = {0};
double norm[50][50], k;
printf("Enter size of a matrix\n");
scanf("%d %d", &row, &col);
printf("Enter matrix of size %dX%d\n", row, col);
for ( row1 = 0; row1 < row; row1++) {
for (col1 = 0; col1 < col; col1++) {
scanf("%d", &assignMatrix[row1][col1]);
}
}
printf("\nrows: %d cols: %d elements:\n",row,col);
for( row1 = 0; row1 < row; row1++) {
for( col1 = 0; col1 < col; col1++) {
printf("%d ", assignMatrix[row1][col1]);
}
printf("\n");
}
for (row1 = 0; row1 < row; row1++) {
for (col1 = 1; col1 < col; col1++) {
a = assignMatrix[r][c];
square[row1] += a * a;
}
printf("Sum of squares of row %d: %lld\n",row1,square[row1]);
}
for ( row1 = 0; row1 < row; row1++ ) {
k = 1.0 / sqrt(square[row1]);
for( col1 = 0; col1 < col; col1++ ) {
norm[row1][col1] = k * assignMatrix[row1][col1] ;
}
}
printf("\nNormalized Matrix:\n");
for( row1 = 0; row1 < row; row1++) {
for( col1 = 0; col1 < col; col1++) {
printf("%.3lf ", norm[row1][col1]);
}
printf("\n");
}
return 0;
}输出结果
Enter size of a matrix 2 3 Enter matrix of size 2X3 4 5 6 1 2 3 rows: 2 cols: 3 elements: 4 5 6 1 2 3 Sum of squares of row 0: 61 Sum of squares of row 1: 13 Normalized Matrix: 0.512 0.640 0.768 0.277 0.555 0.832 Process returned 0 (0x0) execution time : 12.446 s Press any key to continue.