Efficient Code for Filling Rows of an Array involving Indices Ranges
조회 수: 2 (최근 30일)
이전 댓글 표시
Hello,
I have an array A of zeros. I need to set a range of column indices for each row of A to ones. These ranges are determined by elements of another vector B, specifying start and end indices for the ranges for each row. For example, this is what I'm trying to figure out:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/145586/image.jpeg)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/145587/image.jpeg)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/145588/image.jpeg)
The first row of B indicates that the first row of A should have ones from columns 1 to 3. The second row of B indicates that the second row of A should have ones from columns 2 to 4 etc.
I could code this with a for-loop that goes through each of the rows and creates indices with the colon operator however, I'm hoping for a smarter, more efficient way to do it than that.
Can anyone help me with this or any suggestions?
Thanks.
댓글 수: 0
채택된 답변
추가 답변 (4개)
Guillaume
2014년 10월 2일
편집: Guillaume
2014년 10월 2일
I don't think there's a more efficient way of doing it than with a loop. The following would work, but it's arguable that it does not involve loops because of the cellfun, and it's certainly convoluted:
A=A';
bounds = sub2ind(size(A), B', repmat(1:size(B, 1), size(B, 2), 1));
indices = cellfun(@(b) b(1):b(2), num2cell(bounds, 1), 'UniformOutput', false);
A([indices{:}]) = 1;
A=A';
댓글 수: 1
Matt J
2014년 10월 3일
I don't think there's a more efficient way of doing it than with a loop.
I don't think so either, nor do I expect a loop's performance to be bad.
Joseph Cheng
2014년 10월 2일
편집: Joseph Cheng
2014년 10월 2일
so... it is certainly a brain teaser to do this without a loop. so far i'm up to this.
A=zeros(3,4);
B = [1 3;2 4;1 1];
a=A';
B=B+repmat([0:4:4*(size(B,1)-1)]',1,2)
a(B)=1
a=a'
which leaves just filling in the zeros between ones without looping.
댓글 수: 0
Matt J
2014년 10월 3일
[M,N]=size(A);
e=(1:M).';
idx1=sub2ind([M,N], e, B(:,1));
idx2a=B(:,2)<N;
idx2b=sub2ind([M,N], e(idx2a), B(idx2a,2)+1);
A(idx1)=1;
A(idx2b)=-1;
A=cumsum(A,2)
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Logical에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!