如何从多个矩阵列表构造目标矩阵?三个形状为(1200,3)的矩阵按规则拼接
原有代码问题
- 循环遍历范围错误:
range(2)仅会处理前2个样本,需要遍历全部1200个样本 - 列表操作语法错误:
append方法一次只能接收1个参数,传入3个参数会直接抛出参数数量异常
实现方案
方案1:修正原有循环写法
import numpy as np def getRotationMatrix(acc_x_sample, acc_y_sample, acc_z_sample, mag_x_sample, mag_y_sample, mag_z_sample): a = np.transpose(np.array([acc_x_sample,acc_y_sample,acc_z_sample])) m = np.transpose(np.array([mag_x_sample,mag_y_sample,mag_z_sample])) B = np.cross(a,m) # (a x m) A = np.cross(B,a) C = a R =[] # 遍历所有样本 for i in range(len(A)): # 按规则拼接单样本的3x3矩阵 single_R = np.column_stack([A[i], B[i], C[i]]) R.append(single_R) # 转换为numpy数组返回,最终形状为(1200,3,3) return np.array(R)
方案2:高性能向量化实现(无循环,推荐大数据量使用)
直接利用numpy的维度堆叠能力,一步生成目标结构,比循环写法效率高1~2个数量级:
import numpy as np def getRotationMatrix(acc_x_sample, acc_y_sample, acc_z_sample, mag_x_sample, mag_y_sample, mag_z_sample): a = np.transpose(np.array([acc_x_sample,acc_y_sample,acc_z_sample])) m = np.transpose(np.array([mag_x_sample,mag_y_sample,mag_z_sample])) B = np.cross(a,m) # (a x m) A = np.cross(B,a) C = a # 沿最后一维堆叠,直接输出形状为(1200,3,3)的结果 return np.stack([A, B, C], axis=-1)
两种方案输出的结果完全一致,取第i个样本对应的3x3矩阵直接用R[i]即可。
内容的提问来源于stack exchange,提问作者Clarence Chan
相关产品推荐
相关产品推荐

