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个评论
j·亚历克斯。李
j·亚历克斯。李 2021年6月18日
尚不清楚“S_phi + phipoints”应该是什么意思每次S_phi [=] 5 xl在L ~ = 5。

登录置评。

接受的答案

帕斯卡Wielsch
帕斯卡Wielsch 2021年6月18日
我终于找到解决问题的循环计算。您可以使用上面的输入变量的初始化测试它。
%提取函数变量
我=大小(1);
J =大小(2);
K =大小(3);
% re-arrangement的矩阵计算(4 d)
S_phi_ForCalc = repmat(重塑(S_phi 5 1,), 1, 1, 1, K);
S_r_ForCalc = repmat(重塑(S_r 5 1,), 1, 1, 1, K);
A_ForCalc =重塑(排列(A [2 1 3]), 1, J, K);
%的目标方程不使用一个循环
(外汇、财政年度)= pol2cart (S_phi_ForCalc + phipoints S_r_ForCalc。* A_ForCalc);
%计算:在X和Y
% - 1:单一作用力之和从所有行(指数二)外汇/财政年度
% - 2:第三势力外汇指数之和/财政年度
Fx_res =笔(金额(外汇,2),3);
Fy_res =总和(总和(财政年度,2),3);
%计算:总合力
[F_res_phi, F_res] = cart2pol (Fx_res Fy_res);%转换:笛卡尔到极
4评论
马特·J
马特·J 2021年6月18日
请注意,最近Matlab, repmat的应该不需要:
S_phi_ForCalc =重塑(S_phi 5 1,);
S_r_ForCalc =重塑(S_r 5 1,);

登录置评。

更多的答案(2)

j·亚历克斯。李
j·亚历克斯。李 2021年6月17日
我发现这:pagemtimes ()
s =兰德(5,5);
x =兰德(5、8,100000);
抽搐
y = pagemtimes (s, x);
toc
运行时间是0.019204秒。
抽搐
z =南(大小(x));
k = 1:尺寸(x, 3)
z (:,:, k) = s * x (:,:, k);
结束
toc
运行时间是0.261254秒。
呃=总和(abs (- z),“所有”)
呃= 1.5855平台以及
2的评论

登录置评。


马特·J
马特·J 2021年6月17日
编辑:马特·J 2021年6月17日
假设 S_r 永远是广场,
B =重塑(S_r *(:,:),大小(A));% B (:,:, k) = S_r * (:,:, k)
2的评论
j·亚历克斯。李
j·亚历克斯。李 2021年6月18日
编辑:j·亚历克斯。李 2021年6月18日
你只需要不断的大小,但这仍然应该工作,整洁!
clc;
清晰;
L = 6;
N = 100000;
S_r =兰德(5升);
一个=兰德(L 8 N);
抽搐
x = pagemtimes (S_r);
toc
运行时间是0.022069秒。
抽搐
y =重塑(S_r * (:,:), [5 8 N]);
toc
运行时间是0.048928秒。
抽搐
z =南(5 8 N);
k = 1:尺寸(3)
z (:,:, k) = S_r * (:,:, k);
结束
toc
运行时间是0.237041秒。
呃=总和(abs (x - y),“所有”)
呃= 0
呃=总和(abs (- z),“所有”)
呃= 1.8814平台以及

登录置评。

s manbetx 845


释放

R2019b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!