python古怪的乘法_python-特殊矢量和按元素乘法

博客围绕Python中两个数组的标量乘法展开,一个数组A有任意长度,每个点是n维向量;另一个数组B有n个条目,每个是3维向量。要求结果数组C是对应标量与3维向量的乘积,实现采用numpy形式,避免大的for循环,并给出了具体示例和解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有2个数组. “ A”是任意长度的一个(假设一个起点有1000个条目),其中每个点都具有一个n维向量,其中每个条目代表一个标量. “ B”是另一个,具有n个条目,每个条目包含一个3维向量.如何进行标量乘法,以使结果为一个数组“ C”,其中每个条目是n个标量中的每个标量与n个3维向量中的每个标量的乘积?

以4-D为例:

a=[[1,2,3,4],[5,6,7,8],....]

b=[[1,0,0],[0,1,0],[0,0,1],[1,1,1]]

结果

c=[[1*[1,0,0],2*[0,1,0],3*[0,0,1],4*[1,1,1]] , [5*[1,0,0],...],...]

该实现应以numpy形式进行,而不要使用大的for循环,因为预计会有超过1000个条目.在我们的情况下,预期n为7.

解决方法:

如果您从以下内容开始:

a = np.array([[1,2,3,4],[5,6,7,8]])

b = np.array([[1,0,0],[0,1,0],[0,0,1],[1,1,1]])

然后,我们可以向a添加一个额外的轴,并沿着它重复数组就可以得到…

>>> a[:,:,None].repeat(3, axis=2)

array([[[1, 1, 1],

[2, 2, 2],

[3, 3, 3],

[4, 4, 4]],

[[5, 5, 5],

[6, 6, 6],

[7, 7, 7],

[8, 8, 8]]])

现在,就像@Jaime所说的那样,在操作时无需使用重复,因为NumPy的广播会处理它:

>>> a[:,:,None] * b

array([[[1, 0, 0],

[0, 2, 0],

[0, 0, 3],

[4, 4, 4]],

[[5, 0, 0],

[0, 6, 0],

[0, 0, 7],

[8, 8, 8]]])

标签:arrays,python,numpy

void SVPWM_Calculation (SVPWM_2R_Type *SVPWM_Cal, Component_2S_Type *VoltRef,TIM_TypeDef *Timer) { _iq18 hUalpha_coef1,hUbeta_coef2; //两相静止坐标系电压给定临时变量 hUalpha_coef1 = _IQ18MPY_MACRO(SVPWM_Cal->coef1, VoltRef->Alpha>>6); hUbeta_coef2 = _IQ18MPY_MACRO(SVPWM_Cal->coef2, VoltRef->Beta>>6); SVPWM_Cal->hx = hUbeta_coef2 * 2; SVPWM_Cal->hy = hUalpha_coef1 + hUbeta_coef2; SVPWM_Cal->hz = hUbeta_coef2 - hUalpha_coef1; //扇区判定 if(SVPWM_Cal->hx > 0) { if((-SVPWM_Cal->hz) > 0) SVPWM_Cal->sector = 1; else { if((-SVPWM_Cal->hy)>= 0) SVPWM_Cal->sector = 3; else SVPWM_Cal->sector = 2; } } else { if((-SVPWM_Cal->hz) <= 0) SVPWM_Cal->sector = 4; else { if((-SVPWM_Cal->hy)>= 0) SVPWM_Cal->sector= 5; else SVPWM_Cal->sector = 6; } } //不同扇区两个基本矢量的时间计算 switch(SVPWM_Cal->sector) { case 1: SVPWM_Cal->ht1 = -SVPWM_Cal->hz;//t1=-z SVPWM_Cal->ht2 = SVPWM_Cal->hx;//t2 =x break; case 2: SVPWM_Cal->ht1 = SVPWM_Cal->hz; SVPWM_Cal->ht2 = SVPWM_Cal->hy; break; case 3: SVPWM_Cal->ht1 = SVPWM_Cal->hx; SVPWM_Cal->ht2 = -SVPWM_Cal->hy; break; case 4: SVPWM_Cal->ht1 = -SVPWM_Cal->hx; SVPWM_Cal->ht2 = SVPWM_Cal->hz; break; case 5: SVPWM_Cal->ht1 = -SVPWM_Cal->hy; SVPWM_Cal->ht2 = -SVPWM_Cal->hz; break; case 6: SVPWM_Cal->ht1 = SVPWM_Cal->hy; SVPWM_Cal->ht2 = -SVPWM_Cal->hx; break; } //通用比较值的计算 SVPWM_Cal->cc1 = SVPWM_Cal->Quard_T + (u16)(SVPWM_Cal->ht1>>20) + (u16)(SVPWM_Cal->ht2>>20);//T/4+Tx/4+Ty/4 = (T+TX+TY)/4 SVPWM_Cal->cc2 = SVPWM_Cal->cc1 - (u16)(SVPWM_Cal->ht2>>19); //(T+TX+TY)/4-TY/2 = (T+TX-TY)/4 SVPWM_Cal->cc3 = SVPWM_Cal->cc2 - (u16)(SVPWM_Cal->ht1>>19);//(T+TX-TY)/4-TX/2 = (T-TX-TY)/4 //不同扇区装载比较值的分配 switch(SVPWM_Cal->sector) { case 1: SVPWM_Cal->cc1Load = SVPWM_Cal->cc3; SVPWM_Cal->cc2Load = SVPWM_Cal->cc2; SVPWM_Cal->cc3Load = SVPWM_Cal->cc1; break; case 2: SVPWM_Cal->cc1Load = SVPWM_Cal->cc2; SVPWM_Cal->cc2Load = SVPWM_Cal->cc3; SVPWM_Cal->cc3Load = SVPWM_Cal->cc1; break; case 3: SVPWM_Cal->cc1Load = SVPWM_Cal->cc1; SVPWM_Cal->cc2Load = SVPWM_Cal->cc3; SVPWM_Cal->cc3Load = SVPWM_Cal->cc2; break; case 4: SVPWM_Cal->cc1Load = SVPWM_Cal->cc1; SVPWM_Cal->cc2Load = SVPWM_Cal->cc2; SVPWM_Cal->cc3Load = SVPWM_Cal->cc3; break; case 5: SVPWM_Cal->cc1Load = SVPWM_Cal->cc2; SVPWM_Cal->cc2Load = SVPWM_Cal->cc1; SVPWM_Cal->cc3Load = SVPWM_Cal->cc3; break; case 6: SVPWM_Cal->cc1Load = SVPWM_Cal->cc3; SVPWM_Cal->cc2Load = SVPWM_Cal->cc1; SVPWM_Cal->cc3Load = SVPWM_Cal->cc2; break; default: break; } //比较器装载 Timer->CH1CVR = SVPWM_Cal->cc1Load; Timer->CH2CVR = SVPWM_Cal->cc2Load; Timer->CH3CVR = SVPWM_Cal->cc3Load; } 请帮我分析一下这部分代码的原理,转换成伪代码,并给出公式
最新发布
03-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值