替换周围的元素

时间:2014-11-17 16:53:03

标签: arrays matlab matrix element

在下面的矩阵中

mapArray = [9,   8,   7,   800  
            8,   7,   6,   800
            21,  1,   3,   800
            800, 800, 800, 800];

是否可以将元素“触摸”值800改为某个值(例如700 ..)?这会让它看起来像这样:

mapArray = [9,   8,   800,   800  
            8,   7,   800,   800
            800, 800, 800,   800
            800, 800, 800,   800];

非常感谢 亚历

4 个答案:

答案 0 :(得分:3)

使用图像处理工具箱,这非常简单(如果您没有图像处理工具箱,则可以使用conv2代替imdilate)。

targetValue = 800;
targetDistribution = mapArray == targetValue;

valuesToReplaceLocation = imdilate(targetDistribution, [0 1 0;1 1 1;0 1 0]) & ~targetDistribution;

mapArray(valuesToReplaceLocation) = 700;

编辑要填充数组,您可以使用图像处理工具箱中的PADARRAY功能。

答案 1 :(得分:0)

可能有更好的方法,但这似乎适合你的例子。

mapArray = [9,   8,   7,   800
8,   7,   6,   800
21,  1,   3,   800
800, 800, 800, 800];

% find row, col indices of the search value
[r,c]=find(mapArray==800)

% compute indexes, plus and minus one
r2=[r-1;r+1;r+1;r-1;r-1 ; r+1 ; r;   r];
c2=[c+1;c-1;c+1;c-1; c  ;  c  ; c+1 ;c-1];

% new variable
mapArrayNew = mapArray;

% only use valid indices.
ixKeep = r2<=size(mapArray,1) & c2<=size(mapArray,2) & r2>0 & c2>0;

% replace
mapArrayNew(sub2ind(size(mapArray),r2(ixKeep),c2(ixKeep))) = 700;

答案 2 :(得分:0)

基于效果的矢量化解决方案基于 bsxfun -

search_val = 800;
replace_val = 700;

mapArray_ext = zeros(size(mapArray)+2);
mapArray_ext(2:end-1,2:end-1) = mapArray;

idx = find(mapArray_ext==search_val);
offset_idx = bsxfun(@plus,[-1:1]',[-1:1]*size(mapArray_ext,1)); %//'
mapArray_ext(bsxfun(@plus,idx,offset_idx(:)')) = replace_val; %//'
mapArray_ext(idx) = search_val;
mapArray = mapArray_ext(2:end-1,2:end-1);

答案 3 :(得分:0)

mapArray = randi([795 805],[10 10]);
search_val = 800;
replace_val = 7;
a = padarray(mapArray==search_val,[1 1]);
b = logical(circshift(a,[0 -1])+circshift(a,[0 1])+...
    circshift(a,[1 0])+circshift(a,[-1 0]));
b(:,end)=[];b(:,1)=[];b(end,:)=[];b(1,:)=[];
newArray = mapArray;
newArray(b) = replace_val;

例如,

mapArray =

799   803   797   801   805   802   797   798   801   795
795   799   798   798   803   799   798   805   797   797
804   797   804   803   800   803   800   799   801   803
805   799   795   797   799   800   797   797   802   795
800   796   795   802   799   798   804   804   797   805
800   796   796   797   798   805   797   805   796   803
798   805   802   799   800   804   797   799   798   800
804   805   803   801   800   801   796   796   798   801
799   801   802   803   803   801   797   797   799   797
796   795   799   795   803   801   799   799   800   800

newArray =

799   803   797   801   805   802   797   798   801   795
795   799   798   798     7   799     7   805   797   797
804   797   804     7   800     7   800     7   801   803
  7   799   795   797     7   800     7   797   802   795
  7     7   795   802   799     7   804   804   797   805
  7     7   796   797     7   805   797   805   796     7
  7   805   802     7     7     7   797   799     7   800
804   805   803     7     7     7   796   796   798     7
799   801   802   803     7   801   797   797     7     7
796   795   799   795   803   801   799     7     7     7