How to replace non consecutive value on a vector?
2 ビュー (過去 30 日間)
古いコメントを表示
Hi, I want to replace non consecutive value on a vector, for example:
A=[5,5,5,5,5,4,5,5,5,5,4,4,5,5,5,5,4,4,4,5,5,5,5];
From A, I want to replace the value 4 to 5, provided that 4 comes only once or twice.
So, I want to replace the below 4 (bold) to 5.
A=[5,5,5,5,5,4,5,5,5,5,4,4,5,5,5,5,4,4,4,5,5,5,5];
The result would be..
A=[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,5,5,5,5];
How can find those 4s and replace them to the value I want?
I want to generalize the code to apply for another cases (not only for this 4 and 5 case)
Many thanks!
0 件のコメント
採用された回答
Image Analyst
2022 年 5 月 31 日
A = [5,5,5,5,5,4,5,5,5,5,4,4,5,5,5,5,4,4,4,5,5,5,5];
% Get the mode value
modeValue = mode(A)
% Find out where the array is not the mode value
mask = A ~= modeValue
% Extract only those locations where the non-mode values
% are a sequence of 1 or 2 long.
mask = bwareafilt(mask, [1, 2])
% Replace those locations with the mode value
A(mask) = modeValue
modeValue =
5
mask =
1×23 logical array
0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0
mask =
1×23 logical array
0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
A =
Columns 1 through 20
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 5
Columns 21 through 23
5 5 5
See? Only the lengths of 4 that were 1 and 2 long were replaced by 5.
0 件のコメント
その他の回答 (2 件)
Davide Masiello
2022 年 5 月 31 日
編集済み: Davide Masiello
2022 年 5 月 31 日
You could write a function that scans your array in search of the pattern you specify and replaces it with another.
clear
clc
A = [5,5,5,5,5,4,5,5,5,5,4,4,5,5,5,5,4,4,4,5,5,5,5];
pat = [5,4,5];
rep = [5,5,5];
A = replacePattern(A,pat,rep)
A = replacePattern(A,[5,4,4,5],[5,5,5,5])
function out = replacePattern(array,pat,rep)
for idx = 1:length(array)-length(pat)+1
if all(array(idx:idx+length(pat)-1) == pat)
array(idx:idx+length(pat)-1) = rep;
end
end
out = array;
end
0 件のコメント
the cyclist
2022 年 5 月 31 日
編集済み: the cyclist
2022 年 5 月 31 日
Here is an absolutely terrible, obfuscated way to do this:
A = [5,5,5,5,5,4,5,5,5,5,4,4,5,5,5,5,4,4,4,5,5,5,5];
SA = char(A);
S = {char([5 4 5]);
char([5 4 4 5])};
R = {char([5 5 5]);
char([5 5 5 5])};
for nr = 1:numel(R)
SA = strrep(SA,S{nr},R{nr});
end
A = SA - char(0)
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Biological Physics についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!