一、计算的核心
和离散数学中 矩阵计算类似。
维度匹配前提:仅当矩阵A(m×n)的列数n = 矩阵B(n×p)的行数n,二者可相乘;结果矩阵C维度为m×p(A的行数×B的列数)。
例如A(4×512) × B(512×4) → C(4×4)
元素计算逻辑:结果C[i][j] = A第i行与B第j列,对应元素相乘后求和,公式:
C[i][j] = Σ(k=0到n-1)A[i][k] × B[k][j]
关键性质:不满足交换律(A×B≠B×A),满足结合律((A×B)×C=A×(B×C))。
二、代码
std::vector<std::vector<float>> manual_matrix_multiply(
const std::vector<std::vector<float>>& A,
const std::vector<std::vector<float>>& B) {
int m = A.size();
int n = A[0].size();
int p = B[0].size();
std::vector<std::vector<float>> C(m, std::vector<float>(p, 0.0f));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < p; ++j) {
for (int k = 0; k < n; ++k) { // 公共维度
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
// 将LibTorch张量转换为二维vector
std::vector<std::vector<float>> tensor_to_vector(const torch::Tensor& tensor) {
torch::Tensor t = tensor.detach().cpu().to(torch::kFloat32);
int m = t.size(0);
int n = t.size(1);
std::vector<std::vector<float>> vec(m, std::vector<float>(n));
//赋值
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
vec[i][j] = t[i][j].item<float>();
}
}
return vec;
}