【发布时间】:2017-06-06 19:56:14
【问题描述】:
我有两个物理“对象”。我用两个不同的数组代表他们的位置。
• 对象 1 仅在 xy 平面中移动
• 对象 2 在所有三个物理维度中移动
目标:矢量化四个for 循环而不扭曲数据。此外,目的是对要与对象 2 比较的对象 1 的所有可能值执行此操作。
这里是sn-p的代码:
Npos = 21;
Nsam = 200;
% dummy initialisation
AX = rand(1, Npos);
AY = zeros(1, Npos);
AZ = rand(1, Npos);
Bx = rand(Nsam);
By = rand(Nsam);
Bz = rand(Nsam);
for qx = 1 : Npos
for yx = 1 : Npos
for zx = 1 : Nsam
for cx = 1 : Nsam
Tx2Array( qx, yx, zx, cx ) = sqrt( ( AX( qx ) - Bx( zx, cx ) ).^2 + ( AY( yx ) - By( zx, cx ) ).^2 + ( AZ( yx ) - Bz( zx, cx ) ).^2 );
end
end
end
end
% Result is a 21 x 21 x 200 x 200 matrix filled with all real numbers
传奇
AX、AY、AZ 是 1 x 21 的数组,代表对象 1 的 (x,y=0,z)
AY 全部为零,但为了便于阅读,仍然包含在内(因此没有第五个循环!)
Bx、By、Bz 都是 200 x 200 的数组,代表对象 2 的 (x,y,z)
Npos = 21; Nsam = 200;
上面用到的公式是:
sqrt( (a1-b1)^2 + (a2-b2)^2 + (a3-b3)^2 )
【问题讨论】:
-
提供minimal reproducible example 可能很有用,即初始化所有变量(使用随机值)
-
您要做的第一件事是预先分配
Tx2Array。即在循环之前写:Tx2Array = zeros(Npos,Npos,Nsam,Nsam)。 -
可以,但是向量运算不需要预先分配。
-
我不了解您输入的尺寸,但在我看来,您可以使用
ndgrid和pdist2完成所有操作。 -
@beaker,我以前从未使用过这些功能。你能创建一个答案来扩展它们吗?
标签: matlab matrix matrix-multiplication