how to replace consecutive 4 elements of an array with the largest element among every 4 consecutive element ?
1 次查看(过去 30 天)
显示 更早的评论
a=[12 58 16 56 23 7 8 45 53 56 12 32 65 12 23 54];
b=zeros(16,1)
for i=1:4:16
for i=1:1:4
if (a(i)>=a(i+1) && a(i)>=a(i+2) && a(i)>=a(i+3));
b(i)=a(i);
b(i+1)=a(i);
b(i+2)=a(i);
b(i+3)=a(i);
elseif (a(i+1)>=a(i) && a(i+1)>=a(i+2) && a(i+1)>=a(i+3));
b(i)=a(i+1);
b(i+1)=a(i+1);
b(i+2)=a(i+1);
b(i+3)=a(i+1);
elseif (a(i+2)>=a(i) && a(i+2)>=a(i+1) && a(i+2)>=a(i+3));
b(i)=a(i+2);
b(i+1)=a(i+2);
b(i+2)=a(i+2);
b(i+3)=a(i+2);
else
b(i)=a(i+3);
b(i+1)=a(i+3);
b(i+2)=a(i+3);
b(i+3)=a(i+3);
end
end
end
b should be [58 58 58 58 45 45 45 45 56 56 56 56 65 65 65 65]
采纳的回答
Image Analyst
2016-3-26
The other two answers are good for what you asked. One other way I'll just mention is that you can use blockproc() to move along in "jumps" of 4 elements and take the max. Although slightly more compact, it's more cryptic (as compact code often is) and not as easy to understand what it's doing so I won't give it.
Another, related, option (that you didn't ask for but I'll just lay out there for completeness) is to use imdilate() to do "morphological dilation". The constraint though is that it moves along one element at a time as it slides the 4-element window along.
b = imdilate(a, true(1,4));
Again, the window there slides by 1, not in jumps of 4. It's basically a sliding local max filter.
0 个评论
更多回答(3 个)
Star Strider
2016-3-26
编辑:Star Strider
2016-3-26
MATLAB makes this straightforward:
a=[12 58 16 56 23 7 8 45 53 56 12 32 65 12 23 54];
M = reshape(a, 4, []);
Mcolmax = max(M);
b = reshape(ones(4,1) * Mcolmax, 1, [])
b =
58 58 58 58 45 45 45 45 56 56 56 56 65 65 65 65
EDIT — It will work for your (8760x1) vector without modification. I tested it on ‘a’ transposed to a column to be certain it will work with both row and column vectors. The only restriction is that your vector length has to be an integer multiple of 4.
4 个评论
Star Strider
2016-3-27
I don’t have your vector so I can’t check my code with it, but there is either something wrong with your implementation of it or with your interpretation of its results.
It’s a long vector. Are you certain the Command Window didn’t cut off the first two rows, and that you would see them if you scrolled down? The reason is that I don’t see any leading blank lines or the ‘>>’ Command Prompt in your output.
The solution is to use fprintf to print it to a text file, and then look at it in ‘notepad’ or other text editor. If you look at the results using that technique, all the values will have the required 4 occurrences.
Ced
2016-3-26
One possibility would be the following:
1. reshape your vector as a 4xN matrix
a=[12 58 16 56 23 7 8 45 53 56 12 32 65 12 23 54];
A = reshape(a(:),4,[]);
2. get the maximum of each column ( which is a row )
max_col = max(A,[],1);
3. copy the values 4 times and shape as a vector
A = reshape(max_col,4,1);
a = A(:)';
Alternatively, you can use the kronecker function in the last step:
a = kron(max_col,ones(1,4));
or all at once:
a = kron(max(reshape(a(:),4,[]),[],1),ones(1,4));
Cheers
PS: The code above return a row vector in the end (as in your example). If your next application has a 8760*1 vector as you say, you need to transpose the last result (or directly construct a column vector).
0 个评论
Steven Lord
2016-3-26
If you're using release R2016a or later and you want to do this for a vector, take a look at the movmax function.
1 个评论
Image Analyst
2016-3-26
I didn't know about this. I guess I should look at release notes. It looks like imdilate() but with some extra options about how to handles nans and edge effects. It also seems like they overlooked the easy-to-implement movement in "jumps" as this seems like it only moves along one element at a time with no opportunity to move by some specified jump distance.
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!