GNU/Linux >> Belajar Linux >  >> Linux

GNU Octave, membulatkan angka ke presisi satuan

Cara membulatkan elemen dalam matriks dalam Oktaf:

Ada banyak cara berbeda untuk membulatkan matriks dan membulatkan angka dalam oktaf.

Opsi 1, gunakan fitur format sprintf

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

Keluaran , perhatikan token "%5.2f". The 'f' berarti mengharapkan pelampung, 5 berarti menempati 5 ruang. Angka 2 berarti presisi 2 unit setelah titik desimal.

ans = 100.12
ans =   3.12
ans =   2.12
ans =   4.12

Opsi 2, bulatkan ke angka signifikan menggunakan eval dan mat2str

mymatrix2=[100.1234567, 2.12345; 3.1234567891, 4.1234];
j = mat2str(mymatrix2, 3);
mymatrix2=eval(j)

Keluaran , matriks dibulatkan menjadi 3 digit signifikan, perhatikan 100,123 dibulatkan menjadi 100 sedangkan 2,12345 dibulatkan menjadi 2,12

mymatrix2 = 100.0000     2.1200
              3.1200     4.1200

Opsi 3, gunakan fungsi bulat

Fungsi putaran tidak memiliki parameter presisi dalam Oktaf. Namun Anda dapat meretasnya dengan mengalikan setiap item dalam matriks dengan 100, membulatkannya ke int terdekat, lalu membagi setiap item dengan 100:

mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
round(mymatrix .* 100) ./ 100

Keluaran , putaran terjadi dengan benar:

ans = 100.1200     2.1200
        3.1200     4.1200

Opsi 4, tentukan output_precision(num)

Anda melihat bahwa opsi 3 di atas mempertahankan angka nol di belakangnya, yang mungkin tidak diinginkan, jadi Anda dapat memintanya untuk pergi dengan menyetel output_precision:

mymatrix=[100.1234567, 2.12345; 3.1234567891, 4.1234];
disp(mymatrix);
output_precision(3)
disp(mymatrix)

Keluaran :

100.1235     2.1235
  3.1235     4.1234

100.123     2.123
  3.123     4.123

Oktaf memiliki beberapa perilaku aneh ketika mencoba melakukan pembulatan karena oktaf berusaha keras untuk menerapkan pembulatan yang seragam ke semua item dalam matriks. Jadi jika Anda memiliki banyak kolom dengan nilai yang sangat berbeda, oktaf melihat nilai kecil dan berkata:"Saya harus mengonversinya menjadi eksponensial seperti 1.0e-04 , sehingga eksponensial yang sama diterapkan ke seluruh struktur data dalam matriks.


bagi mereka yang ingin membuatnya bekerja tanpa menggali jauh ke dalam diskusi mengapa hal-hal seperti ini (yaitu oktaf round masih tidak mendukung argumen kedua yang mendefinisikan presisi).

SOLUSI :

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

Linux
  1. Pengantar GNU Autotools

  2. Pengantar Utilitas Inti GNU

  3. bc memotong nomor floating point

  1. Pengantar singkat untuk unit jalur

  2. Apa itu ?=di Makefile

  3. Apakah GNU/Linux menghitung proses dan utas secara bersamaan saat saya membatasi jumlahnya?

  1. Instal GNU Octave di Ubuntu 20.04 LTS - Panduan langkah demi langkah?

  2. Jumlah Baris Dikeluarkan Oleh Ls?

  3. Membulatkan angka yang dibagi dalam Bash