2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 20:16 


26/09/17
341
хм... спасибо! значит проблема возникает при выполнении 'str2num':
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
>> A
 
ans =
 
577860808979686845212233454756554348078617853952
 
>> B
 
ans =
 
7740088
 
>> str2num(strrep(num2str([A  B], '%d'), ' ', ''))

ans =

   Inf

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

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 20:25 
Заслуженный участник


20/08/14
11797
Россия, Москва
Сделайте без строк:
$$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 


26/09/17
341
Нашел команду 'strlength', но почему то она неверно считает длину числа в цифрах:
Используется синтаксис Matlab M
>> A
 
ans =
 
577860808979686845212233454756554348078617853952
 
>> strlength(num2str(A))

ans =

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

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 21:18 
Заслуженный участник


18/09/21
1756
Наверно "num2str(A)" для такого большого числа выдаёт результат в виде числа с экспонентой.
Посмотрите, что там за строка.

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

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


26/09/17
341
с подходом все ок - мне с числами надо работать как со словами))

-- 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 
Заслуженный участник
Аватара пользователя


01/09/13
4656
maximkarimov в сообщении #1625809 писал(а):
с числами надо работать как со словами

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

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

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 22:19 
Заслуженный участник


12/08/10
1677
maximkarimov в сообщении #1625809 писал(а):
'cail' нужно заменить на 'floor
Там в формуле нижняя целая часть а это функция floor

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение13.01.2024, 22:24 


26/09/17
341
zykov в сообщении #1625808 писал(а):
Наверно "num2str(A)" для такого большого числа выдаёт результат в виде числа с экспонентой.
Посмотрите, что там за строка.

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

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

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 00:31 
Заслуженный участник


12/07/07
4523
Используется синтаксис Matlab M
>> A = sym(577860808979686845212233454756554348078617853952);
>> B = sym(740088);
>> strcat(char(A), char(B))
ans =
    '577860808979686845212233454756554348078617853952740088'
 

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 00:32 
Заслуженный участник
Аватара пользователя


01/09/13
4656
maximkarimov в сообщении #1625818 писал(а):
Я использую натуральные числа в качестве алфавита, поэтому и имеется такая задача - ведь слова и выражения в естественном языке получаем именно конкатенацией.

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

-- 14.01.2024, 00:34 --

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

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

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 00:37 


26/09/17
341
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 
Заслуженный участник


20/08/14
11797
Россия, Москва
maximkarimov
А abs() то зачем? Вы собрались соединять строки со знаком?! Так тем более не получится!

 Профиль  
                  
 
 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Сообщение14.01.2024, 17:22 
Заслуженный участник


12/07/07
4523
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

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group