In GNU Octave version 3.4.3 I want to round a matrix to 2 units precision on the contents of a matrix like this.
mymatrix=[1.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
This prints:
1.1235 2.1235
3.1235 4.1234
As you can see, the disp forces the precision to '5', I want the units precision to be 2. How do I do this?
Y = round( X , N ) rounds to N digits: N > 0 : round to N digits to the right of the decimal point.
The output_precision command is what you want. Setting format long provides much more than the requested amount of precision. That may be okay, but if you want a specific precision, use output_precision instead.
There are many different ways to round a matrix and round a number in octave.
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
rows = rows(mymatrix);
cols = columns(mymatrix);
for i = 1:rows
for j = 1:cols
sprintf("%5.2f", mymatrix(j,i))
endfor
endfor
Output, note the "%5.2f" token. The 'f' means expect a float, the 5 means occupy 5 spaces. The 2 means 2 units precision after the decimal point.
ans = 100.12
ans = 3.12
ans = 2.12
ans = 4.12
mymatrix2=[100.1234567, 2.12345; 3.1234567891, 4.1234];
j = mat2str(mymatrix2, 3);
mymatrix2=eval(j)
Output, matrix rounded to 3 significant digits, notice 100.123 rounded to 100 while the 2.12345 was rounded to 2.12
mymatrix2 = 100.0000 2.1200
3.1200 4.1200
The round function does not have a precision parameter in Octave. However you can hack around it by multiplying each item in the matrix by 100, rounding it to the nearest int, then dividing each item by 100:
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
round(mymatrix .* 100) ./ 100
Output, round occurs correctly:
ans = 100.1200 2.1200
3.1200 4.1200
You noticed that option 3 above kept the trailing zeros, which may be undesirable, so you can tell them to go away by setting output_precision:
mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
output_precision(3)
disp(mymatrix)
Output:
100.1235 2.1235
3.1235 4.1234
100.123 2.123
3.123 4.123
Octave has some odd behavior when trying to do rounding because octave tries hard to uniformly apply a uniform rounding to all items in a matrix. So if you have multiple columns with wildly different values, octave sees a tiny value and says: "I should convert that to an exponential like 1.0e-04
, and so the same exponential is applied to the entire data structure in the matrix.
for those who want to get it working without digging deep into discussion why things are this way (namely octave round
still does not support a second argument defining precision).
WORKAROUND:
a = [0.056787654, 0.0554464; 0.056787654, 0.0554464];
a
round_digit = 2;
if exist('OCTAVE_VERSION', 'builtin') ~= 0;
a = a.*(10^(round_digit));
if (a >= 0) a = floor(a); else a = ceil(a); endif;
a = a.*(10^(-round_digit));
else
a = round(a, round_digit);
end
a
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With