If only one positive elem per row (rest are 0), then fill both sides of positive element

조회 수: 2(최근 30일)
Dave 2015년 2월 20일
편집: John D'Errico 2015년 2월 20일
Hi, I have a square matrix of non-negative elements. In each row, at least one element is positive.
For rows where there is only one positive element (the rest are 0) I need to put 1e-4 next to that element, both sides. In A below, the second and last row have only 1 positive (note last row has only one side to add)
A=...
[0.9 0.1 0 0;
0 0.8 0 0;
0 0.1 0.7 0.1;
0 0 0 0.9]
Ouput should be:
B=...
[0.9 0.1 0 0;
1E-4 0.8 1E-4 0;
0 0.1 0.7 0.1;
0 0 1E-4 0.9]
The dimension of the matrix is fixed, so I can get rows that need to be changed (if result is 3 in this case) with
sum(A==0,2)
But this doesn't tell me the position of the positive element (I could use something like find(A) ) , nor fill both sides (loop free if possible)

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

채택된 답변

Guillaume 2015년 2월 20일
A = [0.9 0.1 0 0
0 0.8 0 0
0 0.1 0.7 0.1
0 0 0 0.9];
Apadded = [zeros(size(A, 1), 1) A zeros(size(A, 1), 1)]; %pad to avoid dealing with edges
lonelyrows = find(sum(A ~= 0, 2) == 1);

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

추가 답변(2개)

Sean de Wolski 2015년 2월 20일
편집: Sean de Wolski 2015년 2월 20일
And just for fun:
A=...
[0.9 0.1 0 0;
0 0.8 0 0;
0 0.1 0.7 0.1;
0 0 0 0.9];
B = A;
sgn = sign(A)==1;
B(logical(conv2(double(bsxfun(@and,sum(sgn,2)==1,sgn)),[1 0 1],'same'))) = 1e-4
댓글 수: 1표시숨기기 없음
John D'Errico 2015년 2월 20일
Fun, and pretty too.

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

dpb 2015년 2월 20일
Find the locations needing to be worked around. Pick one dimension first as you've done; I'll stick with the rows...
>> irow=find(sum(A>0,2)==1)
irow =
2
4
>> [~,icol]=ind2sub(size(A(irow,:)),find(A(irow,:)>0))
icol =
2
4
>>
These are now indices in the original array since didn't reduce the number of columns by subselecting the rows.
댓글 수: 2표시숨기기 이전 댓글 수: 1
dpb 2015년 2월 20일
Ran out of time...methinks bsxfun the irow,icol array of indices with padded array as Guillame did would also work...

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

Community Treasure Hunt

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

Start Hunting!