MATLAB如何摆脱减去两个数组的循环

Ver*_*ian 2 arrays algorithm matlab vector vectorization

我试图在不同大小的MATLAB中减去两个数组,我目前正在使用for循环,这需要很长的时间.有没有办法让下面的代码更快?我想知道是否可以以某种方式在没有for循环的情况下快速创建一个117x489x489的数组.

第一个数组a的尺寸为1x117,第二个数组b的尺寸为489x489.结果矩阵的尺寸为117x489x489.

这是我如何减去两个数组:

for i = 1:length(a)
  result(i) = a(i) - b;
end
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 6

你可以bsxfun在这里使用有效的方法来避免循环,通过做expansions两者ab大小,117x489x489然后elementwise subtraction在引擎盖下执行.因此,它提出了一种矢量化方法来实现所需的结果.这是代码 -

result = bsxfun(@minus,a(:),permute(b,[3 1 2]))
Run Code Online (Sandbox Code Playgroud)

(:)apermuteb在创造有助于singleton dimensionsab根据需要与它们各自的扩张分别bsxfun.


你可以避免permute有一些reshaping像这样的 -

result = reshape(bsxfun(@minus,a(:),b(:).'),[numel(a) size(b)])
Run Code Online (Sandbox Code Playgroud)