필터 지우기
필터 지우기

Changing elements of vector with matrix

조회 수: 1 (최근 30일)
Michael Clausen
Michael Clausen 2020년 6월 24일
댓글: Michael Clausen 2020년 6월 24일
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

채택된 답변

Stephen23
Stephen23 2020년 6월 24일
편집: Stephen23 2020년 6월 24일
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
Stephen23
Stephen23 2020년 6월 24일
"I was hoping to do the manuvre without a loop"
See my edited answer.
Michael Clausen
Michael Clausen 2020년 6월 24일
Thanks :-)

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Ashish Azad
Ashish Azad 2020년 6월 24일
편집: Ashish Azad 2020년 6월 24일
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
Stephen23
Stephen23 2020년 6월 24일
편집: Stephen23 2020년 6월 24일
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 2020년 6월 24일
Yeah truly said Stephen, size would be robust option

댓글을 달려면 로그인하십시오.


Alan Stevens
Alan Stevens 2020년 6월 24일
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

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by