MATLAB Answers

Changing elements of vector with matrix

3 views (last 30 days)
I have a question regarding a simple operation that I cant find an answer to. Hope that someone can help me.
I have a vector a:
a = zeros(1,10)
and a matrix b:
b = [1, 3; 6, 8]
I want to change elements of a into ones in accordance with the segments indicated by matrix b:
The result should be
1 1 1 0 0 1 1 1 0 0
When I try:
a(b(:,1):b(:,2)) = 1
I get
1 1 1 0 0 0 0 0 0 0
Best regards,
Michael

  0 Comments

Sign in to comment.

Accepted Answer

Stephen Cobeldick
Stephen Cobeldick on 24 Jun 2020
Edited: Stephen Cobeldick on 24 Jun 2020
No loop required:
>> v = 1:numel(a);
>> x = any(v>=b(:,1) & v<=b(:,2), 1); % requires MATLAB >=R2016b
>> a(x) = 1
a =
1 1 1 0 0 1 1 1 0 0
For earlier versions replace the logical comparisons with bsxfun.
Or just use one simple loop:
>> for k = 1:size(b,1), a(b(k,1):b(k,2)) = 1; end
>> a
a =
1 1 1 0 0 1 1 1 0 0

  3 Comments

Michael Clausen
Michael Clausen on 24 Jun 2020
Thank you for the quick reply, Ill try your loop.
I was hoping to do the manuvre without a loop, but I guess it is not possible?
Stephen Cobeldick
Stephen Cobeldick on 24 Jun 2020
"I was hoping to do the manuvre without a loop"
See my edited answer.

Sign in to comment.

More Answers (2)

Ashish Azad
Ashish Azad on 24 Jun 2020
Edited: Ashish Azad on 24 Jun 2020
The syntax you are using is very ambiguous and will never work
Try
for i=1:length(b)
a(b(i,1):b(i,2))=1;
end
Let me know if this work

  2 Comments

Stephen Cobeldick
Stephen Cobeldick on 24 Jun 2020
Do NOT use length for this code:
for i=1:length(b)
Consider what would happen if b only has one row.
The only robust solution is to use size and specify the dimension.
Ashish Azad
Ashish Azad on 24 Jun 2020
Yeah truly said Stephen, size would be robust option

Sign in to comment.


Alan Stevens
Alan Stevens on 24 Jun 2020
One way as follows:
a =
0 0 0 0 0 0 0 0 0 0
>> b
b =
1 3
6 8
>> a([b(1,1):b(1,2) b(2,1):b(2,2)]) = 1
a =
1 1 1 0 0 1 1 1 0 0

  0 Comments

Sign in to comment.


Translated by