Remap values of 256x256 array based on ranges

1 回表示 (過去 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'.

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!

Translated by