matlab中的矩阵元素错位,matlab – 如何将矩阵中较弱元素附近的弱元素归零?

解决这个问题的基本工作流程可以描述如下 –

>对所有非零点进行排序.

>从最高值开始,并将其N邻域内的所有非零点设置为零.

>对第二个最高点进行相同操作,并将其N邻域内的所有非零点设置为零,排除非零值,其值高于当前值.这个排除部分可以通过代码中非常有用的MATLAB工具triu来实现.

>继续,直到覆盖每个非零点.当然,当我们沿着这个阶梯向下移动时,由于前面讨论过的排除条款,搜索的点数会更少.

这些步骤可以使用矢量化方法实现,不使用特殊工具箱并假设A作为输入 –

%// Distance parameter

N = 2;

%// Find all non-zero points and then sort them in descending manner

[x,y] = find(A~=0)

pts = [x y]

[val,sorted_idx] = sort(A(A~=0),'descend')

pts = pts(sorted_idx,:)

%// Find euclidean distances

distmat = sqrt(squared_dist(pts,pts))

%// Find points to be removed (set to zero); then calculate their linear indices

rm_pts = pts(any(triu(distmat

rm_lin_idx = sub2ind(size(A),rm_pts(:,1),rm_pts(:,2))

%// Use those linear indices to set those in the input as zeros

out = A;

out(rm_lin_idx) = 0;

相关的功能代码(找到平方的欧氏距离) –

function sq_distmat = squared_dist(A,B)

[nA,dim] = size(A);

nB = size(B,1);

A_ext = ones(nA,dim*3);

A_ext(:,2:3:end) = -2*A;

A_ext(:,3:3:end) = A.^2;

B_ext = ones(nB,dim*3);

B_ext(:,1:3:end) = B.^2;

B_ext(:,2:3:end) = B;

sq_distmat = A_ext * B_ext.';

return;

代码运行 –

A =

0 0 0 0.9000 0 0

0 0 0.2000 0 0 0.5000

0 0 0.7000 0 0 0

0 0.4000 0.1000 0 0 0

out =

0 0 0 0.9000 0 0

0 0 0 0 0 0.5000

0 0 0.7000 0 0 0

0 0 0 0 0 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值