Matlab: сохранение только первых N цифр чисел

Я пытаюсь найти способ в Matlab обрезать значения вектора, сохраняя только первые N цифр (я не хочу округлять их, а просто обрезать). Я написал что-то, что преобразует значения в строки, вырезает их и возвращает усеченное число, но это слишком медленно.

Есть более умное решение?

Заранее большое спасибо!


person user1835630    schedule 10.06.2015    source источник
comment
Пожалуйста, напишите, что вы пробовали.   -  person roni    schedule 10.06.2015
comment
Я пробовал все, что здесь предлагалось... но это не сработало matlab-variable/8601823#8601823" title="как хранить только до 4 знаков после запятой в переменной Matlab"> stackoverflow.com/questions/8600249/   -  person user1835630    schedule 10.06.2015
comment
Я пытаюсь объединить два вектора с числами с разным разрешением и отсортировать полученный вектор. Это то, что не работает с методами в ссылке. Если я это сделаю: v1_string = strtrim(cellstr(num2str(v1))); v2_string = strtrim (cellstr (num2str (v2))); а затем я зацикливаю v1_new(i) = str2num(v1_string{i}(1:N)); v2_new(i) = str2num(v2_string{i}(1:N)); это работает, но слишком медленно.   -  person user1835630    schedule 10.06.2015


Ответы (2)


Поскольку вы строго говорите, что не хотите округлять число, вот одно из возможных решений с floor, где я просто опускаю числа после указанных десятичных чисел N, которые я хочу сохранить:

function trunc = truncate(x,N)
    trunc = floor(x*10^N)/10^N;
end

Вот пример запуска:

>> b=rand(1,2)

b =

   0.957166948242946   0.485375648722841

>> truncate(b,3)

ans =

   0.957000000000000   0.485000000000000

Обратите внимание, что если вы рассматриваете числа больше единицы, вышеприведенная функция должна быть немного изменена:

function trunc = truncate(x,N)
        %For numbers equal or greater than 1, getting N first digits
        trunc=x;
        idx = x>=1;
        trunc(idx) = floor(x(idx)/10^N);

        %For decimals, keeping N first digits after comma
        trunc(~idx) = floor(x(~idx)*10^N)/10^N;
end

Еще один запуск функции truncate:

>> b=[123 rand(1,2)]

b =

   1.0e+02 *

   1.230000000000000   0.004217612826263   0.009157355251891

>> truncate(b,2)

ans =

   1.000000000000000   0.420000000000000   0.910000000000000

Важно отметить, что не было сделано никаких проверок, чтобы проверить, действительно ли входные данные для функции содержат количество цифр, превышающее N, что я предположил как верное.

person brodoll    schedule 10.06.2015
comment
Я пробовал это, но это не сработало. Вероятно, есть что-то, связанное с разным разрешением векторов, что делает вещи странными. Я еще не успел понять, что это такое. - person user1835630; 10.06.2015
comment
Было бы лучше использовать fix, а не floor, если есть отрицательные числа - person Luis Mendo; 10.06.2015
comment
Не знал о функции исправления. Спасибо за совет. Вы не возражаете, если я объединю ответ? - person brodoll; 10.06.2015
comment
@user1835630 user1835630 Можно ли получить такой пример, где результаты странные? - person brodoll; 10.06.2015

Вы можете использовать ту же логику, что и в этом примере:

X =-1.665584378238097

Y = round(X / 0.01) * 0.01

Y =

-1.670000000000000

И примените его к векторам/матрицам.

person Philippe K    schedule 10.06.2015