How to replace values?
2 views (last 30 days)
Show older comments
How can I replace values? I've a matrix of 3653x337 Let's consider I've
- dates values
- 0101 0
- 0102 0
- 0103 0
- 0104 1
- 0105 0
- 0106 0
- 0107 0 ....
I need a function to find all these "1"'s in my matrix and to replace it for two days before and after I've a "1".
Thanks!
4 Comments
the cyclist
on 16 Jul 2013
I think he means that if there is a 1 in the second column, put two more 1's before and two more after (all in the second column).
Accepted Answer
the cyclist
on 16 Jul 2013
Here is a simple way that should be easy to understand. I am sure there are slicker ways, but maybe this will suit your purpose.
oldIndex = find(values==1);
newIndex = unique([oldIndex-2; oldIndex-1; oldIndex; oldIndex+1; oldIndex+2]);
values(newIndex) = 1;
3 Comments
Jos (10584)
on 17 Jul 2013
This errors when values has 1's in the beginning or the end ... Moreover, you can skip unique.
More Answers (1)
Jos (10584)
on 17 Jul 2013
Here's a one-liner:
values = [0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1]
values(max(min(bsxfun(@plus,reshape(find(values==1),[],1),-2:2),numel(values)),1))=1
or in more readable format:
values = [0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1]
oldIndex = find(values==1)
newIndex = bsxfun(@plus, oldIndex(:), -2:2)
newIndex = max(newIndex,1)
newIndex = min(newIndex,numel(values))
values2 = values % work on a copy
values2(newIndex) = 1
Note that you do not need unique numbers for right-hand indexing
B = [0 0 0]
B([2 2 2 2 2 2]) = 1
3 Comments
See Also
Categories
Find more on Characters and Strings in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!