MATLAB 如何摆脱两个数组相减的循环
MATLAB How to get rid of loop for subtracting two arrays
我试图在 MATLAB 中减去两个不同大小的数组,我目前正在使用 for 循环,这需要很长时间。
有什么办法可以使下面的代码更快?我想知道是否可以在没有 for 循环的情况下以某种方式快速创建一个 117x489x489 的数组。
第一个数组 a 的尺寸为 1x117,第二个数组 b 的尺寸为 489x489。
结果矩阵的尺寸为 117x489x489。
下面是我如何减去两个数组:
for i = 1:length(a)
result(i) = a(i) - b;
end
你可以在这里使用有效的 bsxfun
来避免循环,方法是将 a
和 b
的 expansions
都做成 117x489x489
的大小,然后在后台执行 elementwise subtraction
。因此,它提出了一种矢量化方法来实现预期的结果。这是代码 -
result = bsxfun(@minus,a(:),permute(b,[3 1 2]))
(:)
与 a
和 permute
与 b
有助于分别为 a
和 b
创建 singleton dimensions
根据需要使用 bsxfun
.
进行各自的扩展
你可以像这样避免 permute
和一些 reshaping
-
result = reshape(bsxfun(@minus,a(:),b(:).'),[numel(a) size(b)])
我试图在 MATLAB 中减去两个不同大小的数组,我目前正在使用 for 循环,这需要很长时间。 有什么办法可以使下面的代码更快?我想知道是否可以在没有 for 循环的情况下以某种方式快速创建一个 117x489x489 的数组。
第一个数组 a 的尺寸为 1x117,第二个数组 b 的尺寸为 489x489。 结果矩阵的尺寸为 117x489x489。
下面是我如何减去两个数组:
for i = 1:length(a)
result(i) = a(i) - b;
end
你可以在这里使用有效的 bsxfun
来避免循环,方法是将 a
和 b
的 expansions
都做成 117x489x489
的大小,然后在后台执行 elementwise subtraction
。因此,它提出了一种矢量化方法来实现预期的结果。这是代码 -
result = bsxfun(@minus,a(:),permute(b,[3 1 2]))
(:)
与 a
和 permute
与 b
有助于分别为 a
和 b
创建 singleton dimensions
根据需要使用 bsxfun
.
你可以像这样避免 permute
和一些 reshaping
-
result = reshape(bsxfun(@minus,a(:),b(:).'),[numel(a) size(b)])