3 d / 2 d矩阵乘法不使用一个循环
9的观点(30天)
显示旧的评论
你好亲爱的MATLAB社区,
我有个问题要提高我的代码的效率,摆脱使用循环。因为我使用虚拟仪器编程技能来自,我经常都更难使用矩阵运算代替循环。
让我先解释你我想做什么。我有一个3 d数据矩阵”(I, j, k)”,我想用连同灵敏度矩阵“S”(值保持平等)部队和转换从极地到笛卡儿。我想做这个计算/转换为每个子矩阵”(:,:,k)”来计算笛卡尔系统单一的力量。后来我想计算所有这些的总产生的力量和将其转换回一个极性体系。
矩阵的维度可以是不同的:
- S_r & S_phi并不总是方阵
- 行nr.总是等于坳nr. S_r / S_phi
- 坳nr. phipoints总是等于长度
%输入数据矩阵(3 d): (i, j, k)
(::1)= (-0.0468 -0.0652 0.2746 0.5272 0.2373 -0.2142 -0.5973 -0.1169
0.0633 0.6673 0.6416 0.3491 -0.0652 -0.0025 -0.8464 -0.7607
-0.0026 0.0000 -0.0373 -0.4378 -0.1612 0.2293 0.2458 0.1656
0.3124 0.2472 0.0048 -0.5034 -0.5051 -0.0434 0.1734 0.3376
-0.0815 -0.4423 0.0308 0.1411 0.1260 - 0.1881 0.0696 - -0.0328);
(::2)= (-0.0468 -0.0652 0.2746 0.5272 0.2373 -0.2142 -0.5973 -0.1169
0.0633 0.6673 0.6416 0.3491 -0.0652 -0.0025 -0.8464 -0.7607
-0.0026 0.0000 -0.0373 -0.4378 -0.1612 0.2293 0.2458 0.1656
0.0696 0.1881 0.1260 0.1411 0.0308 -0.4423 -0.0815 -0.0328
0.1734 -0.0434 -0.5051 -0.5034 0.0048 - 0.2472 0.3124 - 0.3376);
(::3)= (-0.0468 -0.0652 0.2746 0.5272 0.2373 -0.2142 -0.5973 -0.1169
0.0633 0.6673 0.6416 0.3491 -0.0652 -0.0025 -0.8464 -0.7607
0.1734 -0.0434 -0.5051 -0.5034 0.0048 0.2472 0.3124 0.3376
0.2458 0.2293 -0.1612 -0.4378 -0.0373 0.0000 -0.0026 0.1656
-0.0815 -0.4423 0.0308 0.1411 0.1260 - 0.1881 0.0696 - -0.0328);
%的所有计算段(指数j)
phipoints = 0:2 *π/宣告*π2 *π/ 8;
%灵敏度矩阵:振幅和相位
S_r = [0.0317 0.0378 - 0.0344 0.0394 - 0.0333;…
0.0331 0.0410 0.0380 0.0433 0.0375;…
0.0326 0.0415 0.0388 0.0443 0.0393;…
0.0296 0.0386 0.0360 0.0417 0.0383;…
0.0247 0.0334 0.0307 0.0366 0.0354);
S_phi = [0 0 0 0 0;…
0 0 0 0 0;…
0 0 0 0 0;…
0 0 0 0 0;…
0 0 0 0 0];
%是计算每个子矩阵方程(:,:,k);只对
%的文档;必须使用循环执行代码
% pol2cart (S_phi + phipoints S_r * (:,:, k))
我可以使用循环计算这个,但是我的问题是,我要做这个计算对许多这些(维度“k”可以高达数百万)。我的当前版本(见下文)需要时间,所以我在找一个替代方法。
% %当前使用循环计算
%计算:单部队在笛卡尔系统(X和Y)
为k = 1:尺寸(3)
为i = 1:尺寸(1)
(外汇(:,:,我,k),财政年度(:,:,我,k)] = pol2cart (S_phi (:, i) + phipoints S_r(:,我)*(我:k));
结束
结束
%计算:在X和Y
% - 1:单一作用力之和从所有行(指数二)外汇/财政年度
% - 2:第三势力外汇指数之和/财政年度
Fx_res =笔(金额(外汇,2),3);
Fy_res =总和(总和(财政年度,2),3);
%计算:总合力
[F_res_phi, F_res] = cart2pol (Fx_res Fy_res);%转换:笛卡尔到极
提前谢谢和最好的问候,
帕斯卡
5个评论
接受的答案
帕斯卡Wielsch
2021年6月18日
4评论
马特·J
2021年6月18日
请注意,最近Matlab, repmat的应该不需要:
S_phi_ForCalc =重塑(S_phi 5 1,);
S_r_ForCalc =重塑(S_r 5 1,);