2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 20:16 
хм... спасибо! значит проблема возникает при выполнении 'str2num':
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
>> A
 
ans =
 
577860808979686845212233454756554348078617853952
 
>> B
 
ans =
 
7740088
 
>> str2num(strrep(num2str([A  B], '%d'), ' ', ''))

ans =

   Inf

 
Имеется ли способ "побороть" эту незадачу?

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 20:25 
Сделайте без строк:
$$A \cup B=A\cdot10^{\lfloor\log_{10}B\rfloor+1}+B$$
Выражение $\lfloor\log_{10}B\rfloor+1$ равно количеству цифр в числе $B$.
Вопрос лишь в точности вычислений логарифма (если нельзя по другому получить длину числа в цифрах).

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 20:48 
Нашел команду 'strlength', но почему то она неверно считает длину числа в цифрах:
Используется синтаксис Matlab M
>> A
 
ans =
 
577860808979686845212233454756554348078617853952
 
>> strlength(num2str(A))

ans =

    21
 
Хотя длина числа А в цифрах равна 48.
Может кто знает способ "вытащить" число цифр без вычислений?

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 21:18 
Наверно "num2str(A)" для такого большого числа выдаёт результат в виде числа с экспонентой.
Посмотрите, что там за строка.

Вообще складывается ощущение, что ерундой какой-то занимаетесь.
Зачем нужно числа соединять? Вроде Matlab точно не работает с целыми такого большого размера (приведет их к машинному double).
В чём там собственно задача?
Может тут в корне подход неверный...

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 21:21 
с подходом все ок - мне с числами надо работать как со словами))

-- 13.01.2024, 22:50 --

Dmitriy40 в сообщении #1625798 писал(а):
Сделайте без строк:
$$A \cup B=A\cdot10^{\lfloor\log_{10}B\rfloor+1}+B$$
Выражение $\lfloor\log_{10}B\rfloor+1$ равно количеству цифр в числе $B$.
Вопрос лишь в точности вычислений логарифма (если нельзя по другому получить длину числа в цифрах).

Нашел вот такой способ получить длину числа в цифрах и избежать ошибки округления:
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
A =

577860808979686845212233454756554348078617853952
 
B =
 
7740088
 
>> a=sym(ceil(log10(abs(B))))
 
a =
 
7
 
>> res=A*10^(a+1)+B
 
res =
 
57786080897968684521223345475655434807861785395207740088
 
 
Можно заметить, что между A и B "затесался" лишний нолик. Или приведенная Вами формула содержит ошибку (не нужно плюсовать 1 к показателю степени) или же 'cail' нужно заменить на 'floor' при вычислении а. Число разрядов B равно 7, но если использовать 'floor', то a=6 и формулу можно не трогать. Как мне поступить, чтобы избежать ошибок на других аргументах?

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 22:05 
Аватара пользователя
maximkarimov в сообщении #1625809 писал(а):
с числами надо работать как со словами

maximkarimov в сообщении #1625809 писал(а):
или же 'cail' нужно заменить на 'floor'

:facepalm:
Сходите с соседнюю тему про основания мат.анализа - у Вас будет полная идиосимфония с тамошним ТС...

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 22:19 
maximkarimov в сообщении #1625809 писал(а):
'cail' нужно заменить на 'floor
Там в формуле нижняя целая часть а это функция floor

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 22:24 
zykov в сообщении #1625808 писал(а):
Наверно "num2str(A)" для такого большого числа выдаёт результат в виде числа с экспонентой.
Посмотрите, что там за строка.

Вообще складывается ощущение, что ерундой какой-то занимаетесь.
Зачем нужно числа соединять? Вроде Matlab точно не работает с целыми такого большого размера (приведет их к машинному double).
В чём там собственно задача?
Может тут в корне подход неверный...

Да, конвертирует экспонентой. Я использую натуральные числа в качестве алфавита, поэтому и имеется такая задача - ведь слова и выражения в естественном языке получаем именно конкатенацией.
Через вычисления, как предложил Dmitriy40, не оптимально (округление, скорость), а тут засада (похоже на баг) в Матлабе (Octave то склеивает без проблем!).
Если получится найти решение для Матлаба - буду признателен!

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 00:31 
Используется синтаксис Matlab M
>> A = sym(577860808979686845212233454756554348078617853952);
>> B = sym(740088);
>> strcat(char(A), char(B))
ans =
    '577860808979686845212233454756554348078617853952740088'
 

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 00:32 
Аватара пользователя
maximkarimov в сообщении #1625818 писал(а):
Я использую натуральные числа в качестве алфавита, поэтому и имеется такая задача - ведь слова и выражения в естественном языке получаем именно конкатенацией.

Тогда, в результате "конкатенации" Вы получаете новое число, то есть новую букву, но никак не слово.

-- 14.01.2024, 00:34 --

maximkarimov в сообщении #1625818 писал(а):
Через вычисления, как предложил Dmitriy40, не оптимально (округление, скорость)

А как, по Вашему, число преобразуется в строку, а потом, результат "конкатенации", обратно в число?

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 00:37 
GAA в сообщении #1625836 писал(а):
Используется синтаксис Matlab M
>> A = sym(577860808979686845212233454756554348078617853952);
>> B = sym(740088);
>> strcat(char(A), char(B))
ans =
    '577860808979686845212233454756554348078617853952740088'
 

Вот! Работает мгновенно! Я знал, что способ должен быть! Спасибо!!!

-- 14.01.2024, 02:02 --

GAA в сообщении #1625836 писал(а):
Используется синтаксис Matlab M
>> A = sym(577860808979686845212233454756554348078617853952);
>> B = sym(740088);
>> strcat(char(A), char(B))
ans =
    '577860808979686845212233454756554348078617853952740088'
 


Увы, ломается на преобразовании обратно в число:
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
>> A = sym(577860808979686845212233454756554348078617853952);
B = sym(740088);
strcat(char(A), char(B))

ans =

    '577860808979686845212233454756554348078617853952740088'

>> sym(str2num(ans))
 
ans =
 
577860808979686865726998342827658308402608850700599296
 
>>
 

Вообщем реализовал на основе предложения Dmitriy40 вот так:
Используется синтаксис Matlab M
>> A = 577860808979686845212233454756554348078617853952;
B = sym(740088);
a=sym(floor(log10(abs(B))));
res=  A*10^(a+1)+B
 
res =
 
577860808979686845212233454756554348078617853952740088
 
Поскольку использую sym, постольку ошибки округления при вычислении не должно быть.

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 02:16 
maximkarimov
А abs() то зачем? Вы собрались соединять строки со знаком?! Так тем более не получится!

 
 
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 17:22 
maximkarimov в сообщении #1625838 писал(а):
Увы, ломается на преобразовании обратно в число...
Используется синтаксис Matlab M
>> A = sym(577860808979686845212233454756554348078617853952);
>> B = sym(740088);
>> strcat(char(A), char(B))
ans ='577860808979686845212233454756554348078617853952740088'
>> str2sym(ans)
ans = 577860808979686845212233454756554348078617853952740088


-- Sun 14.01.2024 17:02:27 --

maximkarimov в сообщении #1625803 писал(а):
Нашел команду 'strlength', но почему то она неверно считает длину числа в цифрах...
Используется синтаксис Matlab M
>> A = sym('577860808979686845212233454756554348078617853952')
A = 577860808979686845212233454756554348078617853952
>> strlength(char(A))
ans = 48
Это в версии R2019b. С какой версии это будет работать я не зная. В R2013b это не работает.

 
 
 [ Сообщений: 28 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group