Matlab ordfilt2 或加权局部最大值的替代品

问题描述 投票:0回答:1

我想在 Matlab 中计算向量的加权最大值。对于加权最大值我打算如下:

给定一个由

2*N+1
权重
W={w[-N], w[-N+1] .. w[0] .. w[N]}
组成的向量,并给定一个输入序列
A
,加权最大值是一个向量
M
,其中
m[i]=max(w[-N]*a[i-N], w[-N+1]*a[i-N+1], ... w[N]*a[i+N])

因此,例如给定向量

A= [1, 4, 12, 2, 4]
和权重
W=[0.5, 1, 0.5]
,加权最大值将为
M=[2, 6, 12, 6, 4]

这可以使用

ordfilt2
来完成,但是
ordfilt2
使用权重作为加法而不是乘法。

我实际上正在研究 4D 矩阵,但任何 1D 解决方案都可以工作,因为 4D 权重矩阵是可分离的。

我当前的解决方案是生成输入数组

A
的移位副本,根据移位对它们进行加权并最大化所有数组。移位是使用
circshift
执行的,是该过程中的瓶颈。通过索引“手动”生成移位矩阵结果甚至更慢。

您能建议任何更有效的解决方案吗?

编辑:对于正 A,

M=exp(ordfilt2(log(A), length(W), ones(size(W)), log(W)))
可以完成这项工作,但仍然比上面的
circshift
解决方案花费更长的时间。我仍在寻找更有效的解决方案。

matlab max mathematical-morphology
1个回答
0
投票
>> B = padarray(A, [0 floor(numel(W)/2)], 0); % Pad A with zeros
>> B = bsxfun(@times, B(bsxfun(@plus, 1:numel(B)-numel(W)+1, (0:numel(W)-1)')), W(:)); % Apply the weights
>> M = max(B)  % Compute the local maxima
M =
     2     6    12     6     4
© www.soinside.com 2019 - 2024. All rights reserved.