Remap values of 256x256 array based on ranges

조회 수: 4 (최근 30일)
Ram
Ram 2016년 2월 22일
댓글: Ram 2016년 2월 22일
done like this
if (n_rounded>=-90.0) && (n_rounded<-67.5)
n_rounded=-90;
elseif (n_rounded>=67.5) && (n_rounded<90.0)
n_rounded=-90;
elseif (n_rounded>=-67.5) && (n_rounded<-22.5)
n_rounded=-45;
elseif (n_rounded>=-22.5) && (n_rounded<22.5)
n_rounded=0;
elseif (n_rounded>=22.5) && (n_rounded<67.5)
n_rounded=45;
end
getting error Operands to the and && operators must be convertible to logical scalar values.
  댓글 수: 1
Matt J
Matt J 2016년 2월 22일
편집: Matt J 2016년 2월 22일
  1. You cannot apply && and to non-scalars. You could use & and |.
  2. if...else commands do not distribute through the elements of an array

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

채택된 답변

Stephen23
Stephen23 2016년 2월 22일
편집: Stephen23 2016년 2월 22일
The basic problem is that both logical short-circuiting operators || and && operate on scalar value only. Here is an example:
>> false || true % both operands are scalar -> okay!
ans =
1
>> false || [true,false] % scalar and vector -> error!
Operands to the || and && operators must be convertible to logical scalar values.
So clearly your n_rounded is not a scalar, as the inputs to the || and && operators are non-scalar. You can remove this error this by using standard or | or and & operators. Then you will meet another behavior that confuses many beginners: all elements must be true for an if to run:
if [true,false]
disp('this will never run')
end
if [true,true]
disp('this code will run')
end
Alternative Solution
Simply vectorize whole thing and use histc:
>> n_rounded = 180*rand(5)-90
n_rounded =
-14.8919 -1.9345 50.4454 -66.2448 -47.7396
-81.0622 -29.2105 -19.8470 79.5691 -26.4315
72.4889 72.0097 -46.4956 82.1042 57.8149
80.0617 -23.5356 -17.2958 13.5375 -87.2274
-1.6445 -69.9835 -72.6382 -79.2397 -82.2557
>> edg = [-90,-67.5,-22.5,22.5,67.5,90+eps];
>> rep = [-90,-45,0,45,90,NaN];
>> [~,idx] = histc(n_rounded,edg);
>> rep(idx)
ans =
0 0 45 -45 -45
-90 -45 0 90 -45
90 90 -45 90 45
90 -45 0 0 -90
0 -90 -90 -90 -90
  댓글 수: 5
Stephen23
Stephen23 2016년 2월 22일
If it is showing in the command window then it is also in your workspace. Your request is not totally clear to me, but I think you might just need to allocate the output to a variable:
out = rep(idx);
Ram
Ram 2016년 2월 22일
correct done sir

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

추가 답변 (1개)

Matt J
Matt J 2016년 2월 22일
편집: Matt J 2016년 2월 22일
[~,~,bins]=histcounts(n_rounded,[-90,-67.5,-22.5,22.5, 67.5,90] );
targetValues=[-90,-45,0,45,-90];
n_rouned=targetValues(bins);
  댓글 수: 1
Ram
Ram 2016년 2월 22일
error Undefined function 'histcounts' for input arguments of type 'double'.

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

카테고리

Help CenterFile Exchange에서 Convert Image Type에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by