MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   请帮助我用矩阵中的相邻元素检验我的假设 (https://www.labfans.com/bbs/showthread.php?t=23792)

poster 2019-12-10 20:48

请帮助我用矩阵中的相邻元素检验我的假设
 
我无法弄清楚研究的最后一部分,所以如果有人可以帮助我,我将非常感谢您的帮助.. :)

说我的原始矩阵是

X = 0 0 0 0 0 0 0 12 9 0 0 4 9 15 0 0 11 19 0 0 0 2 4 8 0 0 4 5 8 0 0 0 0 0 0 找到非零的平均值后,我将得到如下所示的结果:

new_x = 0 0 0 0 0 0 0 **9.0000** 9.0000 0 0 4.0000 9.0000 **9.0000** 0 0 **8.3333** **8.0000** 0 0 0 2.0000 4.0000 8.0000 0 0 4.0000 5.0000 8.0000 0 0 0 0 0 0 请注意,任何大于10的元素都是“中心”,我们希望找到半径为1 m的非零值的平均值。其中1米=距中心1个元素。

**表示中心。

对于这一部分,我使用了以下内容(来自[URL="https://stackoverflow.com/questions/3402081/test-the-surrounding-non-zeros-elements/3402493#3402493"]gnovice[/URL] ):

X=[0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0; 0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0]; kernel=[0 1 0; 1 0 1; 0 1 0]; sumx=conv2(X,kernel,'same'); nx=conv2(double(X>0),kernel,'same'); index=(X>10); new_x=X; new_x(index)=sumx(index)./max(nx(index),1); 所以[B]我的问题[/B]是,我想[B]比较相邻元素与其中心[/B]是否相等,较小或较大。如果大于或等于1,则为'0',否则将忽略半径之外的任何元素并将其替换为'0'。

例如,中间的9位于12、15和19个中心的半径内,因此取那些min [9.000,9.000,8.000] = 8.000的[B]最小中心[/B] 。在这种情况下,将不考虑4,因为在最后两行中它不被称为“中心”,也没有被称为[8 4 5和8]。

所以我想要类似下面的东西:

Test_x = 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 我之前已经将这个第一部分放在论坛中,对于之前的每个建议,我都感到非常感谢。

请先给我一些想法。我已经尝试过使用循环,但是它似乎没有很好地工作。任何可以为我完成工作的MATLAB函数。

非常感谢你的帮助。

MATLAB初学者

我想我通过使用乔纳斯(Jonas)技术找到了这个问题的解决方案。谢谢您的帮助Jonas和gnovie :)
[INDENT][INDENT] X = [0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0; 0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0];

内核= [0 1 0; 1 0 1; 0 1 0];

sumx = conv2(X,kernel,'same');

nx = conv2(double(X> 0),kernel,'same');

avg_x = X;

avg_x(avg_x 10);

avg_x(索引)= sumx(索引)./ max(nx(索引),1);

[/INDENT][/INDENT]avg_x =

0 0 0 0 0 0 0 9.0000 0 0 0 0 0 9.0000 0 0 8.3333 8.0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0[INDENT][INDENT] tmp_x = avg_x;

maxVal = max(avg_x(:))+ 1;

tmp_x(tmp_x == 0)= maxVal;

tmp_x = imerode(tmp_x,内核);

Test_x = X> = tmp_x;

[/INDENT][/INDENT]
[B]回答:[/B]

我认为您想要做的是基于new_x创建一个新数组,该数组将每个元素替换为其最小的4个相连的邻居。然后,您可以将新数组与new_x进行比较。

这是一种方法(需要图像处理工具箱)

tmp_x = new_x; maxVal = max(new_x(:))+1; tmp_x(tmp_x == 0) = maxVal; %# replace all the zeros in tmp_x with something large tmp_x = imerode(tmp_x,kernel); %# kernel is the same as in the OP Test_x = new_x >= tmp_x; %# put ones wherever the value is %# greater or equal the neighbour's minimum %# only keep 1's that are next to 'centers' Test_x = Test_x .* imdilate(X>10,strel('disk',1)) Test_x = 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 请注意,与您相比,使用这种逻辑我得到的更多。



[url=https://stackoverflow.com/questions/3499894]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 03:05

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.