2017-02-22 20 views
0

Я хочу установить точность для всего элемента матрицы. Ниже то, что я сделал:Установить точность элемента в матрице Matlab

>>A 

A = 

     0 1.0000   0   0   0   0 
-137.0830   0   0   0   0   0 
     0   0   0 1.0000   0   0 
    365.5546   0   0   0   0   0 
     0   0   0   0   0 1.0000 
    365.5546   0   0   0   0   0 

>> vpa(A,2) 

ans = 

[  0, 1.0, 0, 0, 0, 0] 
[ -144.0, 0, 0, 0, 0, 0] 
[  0, 0, 0, 1.0, 0, 0] 
[ 377.0, 0, 0, 0, 0, 0] 
[  0, 0, 0, 0, 0, 1.0] 
[ 377.0, 0, 0, 0, 0, 0] 

Результат не мое желание, оно должно быть: -137,08, 365,55, 365,55 в первой колонке. Пожалуйста, помогите мне предложить, как это получить. Большое вам спасибо!

+0

'137.08' имеют * пять * значащие цифры, и вы только запрашивающие 2. – Suever

ответ

1

Вы не используете vpa правильно. Из docs:

VPA (х, г) использует по крайней мере д значащих цифр

Nota, что он говорит, по крайней мере, . Вот почему вы все еще получаете 377, когда вы только запрашивали 2 значащих цифры.

Кажется, что вы не знаете, какие значащие цифры. От Wikipedia:

Значимые показатели ряда являются цифры, которые несут смысл вклад в ее разрешение измерений. Сюда входят все цифры за исключением:

  • Все ведущие нули;
  • Конечные нули, когда они просто заполнители, чтобы указать масштаб номера (точные правила объясняются при определении значащих цифр); и
  • Паразитные цифры, введенные, например, вычислениями, выполненными с большей точностью, чем вычисления исходных данных, или измерения с большей точностью, чем оборудование поддерживает.

Так что вы хотите это

>> vpa(365.5546, 5) 
ans = 
365.55 

Теперь, чтобы быть последовательным, вам необходимо выяснить, что является максимумом вашей матрицы и compute the desired number of significant digits оттуда.

max_number = floor(log10(max(abs(A(:))+1)) + 1); 
decimals = 2; 
vpa(A, max_number + decimals) 

Здесь max_number максимальное число целого цифр, что ваша матрица имеет, и decimals является количеством знаков после запятой, которые вы хотите иметь.

+0

@greenworld Я исправил ошибки' max_number', в случае, если вы используете эту строку. Я также добавил краткое разъяснение по этой части кода. – iled

1

second input к vpa является number of significant digits, который не такой же, как число значений после точки поразрядной. Число -137.08 на самом деле имеет пять signficant цифры так что вы хотите использовать второй вход 5

vpa(A, 5) 

% [  0, 1.0, 0, 0, 0, 0] 
% [ -137.08, 0, 0, 0, 0, 0] 
% [  0, 0, 0, 1.0, 0, 0] 
% [ 365.55, 0, 0, 0, 0, 0] 
% [  0, 0, 0, 0, 0, 1.0] 
% [ 365.55, 0, 0, 0, 0, 0] 
-1

vpa(x,d): d Значительные цифры, а не десятичные разряды.

pvalue = vpa(-137.0830); 
twopvalue = vpa(-137.0830,2); 

% pvalue = -137.08299999999999840838427189738 
% twopvalue = -144.0 

Если вы хотите получить -137.08, 365.55, 365.55 в первой колонке. Вы можете использовать roundn(A,-2)

roundn(A,-2) 

ans = 

     0 1.0000   0   0   0   0 
-137.0800   0   0   0   0   0 
     0   0   0 1.0000   0   0 
    365.5500   0   0   0   0   0 
     0   0   0   0   0 1.0000 
    365.5500   0   0   0   0   0 
+0

Если вы знаете разницу между значащими цифрами и десятичными разрядами, почему вы советуете ему использовать «круглый»? См. Разницу между «round (0.001, 2)» и «vpa (0.001, 2)». – iled

+0

Прошу прощения, что я немного нечувствителен. Спасибо за ваши ценные комментарии. –