Numpy 3D数组/Eigen Tensor无循环实现每行乘自身转置的方法
你给出的运算本质是对A[0, :, 0]这个长度为50的一维向量求外积,以下分别给出Eigen和numpy的实现:
Eigen::Tensor 实现(优先方案)
完全使用reshape和broadcast接口实现,无额外依赖:
#include <Eigen/CXX11/Tensor> int main() { // 输入Tensor A 维度为 [55, 50, 2],此处为示例初始化,可替换为你实际的输入 Eigen::Tensor<double, 3> A(55, 50, 2); // 1. 提取目标一维向量,shape为[50] Eigen::Tensor<double, 1> vec = A.chip(0, 0).chip(0, 1); // 2. 构造左张量:reshape为[50,1]后广播第二个维度到50,得到[50,50] Eigen::array<Eigen::Index, 2> left_reshape_dims = {50, 1}; Eigen::array<Eigen::Index, 2> left_broadcast_dims = {1, 50}; Eigen::Tensor<double, 2> left = vec.reshape(left_reshape_dims).broadcast(left_broadcast_dims); // 3. 构造右张量:reshape为[1,50]后广播第一个维度到50,得到[50,50] Eigen::array<Eigen::Index, 2> right_reshape_dims = {1, 50}; Eigen::array<Eigen::Index, 2> right_broadcast_dims = {50, 1}; Eigen::Tensor<double, 2> right = vec.reshape(right_reshape_dims).broadcast(right_broadcast_dims); // 4. 逐元素相乘得到最终外积结果B Eigen::Tensor<double, 2> B = left * right; return 0; }
Numpy实现
仅使用reshape和广播机制,不使用np.einsum、np.dot和循环:
import numpy as np # 假设A为输入的shape(55,50,2)数组 vec = A[0, :, 0] # 直接通过reshape加广播得到外积,和你给出的原始代码输出完全一致 B = vec.reshape(50, 1) * vec.reshape(1, 50)
内容的提问来源于stack exchange,提问作者lefe
相关产品推荐
相关产品推荐

