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

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




На страницу 1, 2  След.
 Матлаб: есть ли простой способ конкатенации разрядов?
Требуется к первому числу "приклеить" второе, например: на входе вектор [3 1], на выходе число 31.
Есть ли такая возможность в среде Матлаб?

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
maximkarimov
Первое умножить на 10 и сложить со вторым?

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Вот тут есть пара вариантов
https://www.mathworks.com/matlabcentral ... ype-double

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Используется синтаксис Matlab M
[3 1]*10.^[1:-1:0]'
str2num(num2str([3 1], "%1d"))

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Уважаемый zykov, если в последней строчке Вашего кода исправить две ошибки синтаксиса вот так:
Используется синтаксис Matlab M
str2num(num2str([33 24], '%1.d'))
, то она работает и дает искомый результат.
Спасибо огромное!

-- 13.01.2024, 15:21 --

zykov в сообщении #1625745 писал(а):
Используется синтаксис Matlab M
[3 1]*10.^[1:-1:0]'
str2num(num2str([3 1], "%1d"))

Упс!) В общем случае не работает(( Например:
Используется синтаксис Matlab M
str2num(num2str([333 24], '%1.d'))

Причем не могу понять когда "склейка" выполняется, а когда нет. Подскажите?

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
У меня без точки '%1.d'.
(Но вообще, первый вариант со степенью 10 лучше, если там конечно цифры, а не числа больше 9.)

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Ну, можно бы догадаться, что я умею считать больше, чем до 9.))
Я вот что не могу понять - почему вот так склейка выполняется:
Используется синтаксис Matlab M
num2str([345 7740088], '%d')

А при перестановке тех же самых аргументов - нет:
Используется синтаксис Matlab M
num2str([7740088 345], '%d')

Подскажите?

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
У меня в Octave и так, и так работает.
Скиньте сюда, что выдаёт Matlab, может яснее станет.

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Используется синтаксис Matlab M
>> num2str([7740088 345], '%d')

ans =

    '7740088    345'
 
У Вас по-другому? Если да - скопируйте строчку своего кода, плиз - вдруг Вы используете другой синтаксис!)

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
В Octave:
Используется синтаксис Matlab M
>> num2str([7740088 345], '%d')
ans = 7740088345

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
чудеса в решете какие-то - у меня не склеивает((
может кто-то у себя повторить? неужели только у меня "кривой" Матлаб?

ага, не обратил внимание, что Вы используете Octave...
блин, что же делать?((

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Такой хак делайте:
Используется синтаксис Matlab M
strrep(num2str([7740088 345], '%d'), ' ', '')

И так должно было работать, но что-то этот новый Matlab по другому теперь это делает.

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Ура! Отличный взлом!
Используется синтаксис Matlab M
>> strrep(num2str([7740088 345], '%d'), ' ', '')

ans =

    '7740088345'

>> strrep(num2str([345 7740088], '%d'), ' ', '')

ans =

    '3457740088'
 
Спасибо!

-- 13.01.2024, 20:14 --

zykov в сообщении #1625787 писал(а):
Такой хак делайте:
Используется синтаксис Matlab M
strrep(num2str([7740088 345], '%d'), ' ', '')

И так должно было работать, но что-то этот новый Matlab по другому теперь это делает.

Реализовал с Вашей помощью нужную мне функцию:
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
function [res] = sumWords(A,B)
if any(isnan(A)) || any(isnan(B))
    res=nan;
    return
elseif all(A==0)
    res=B;
    return
elseif all(B==0)
    res=A;
    return
end
if all(A>0) || all(A<0)
    if all(B>0) || all(B<0)        
        if all(A>0) && all(B<0) || all(A<0) && all(B>0)  
            if isequal(abs(A),abs(B))
                res=zeros(1,length(A));
            else
                res=nan;
            end
        else
            temp=str2num(strrep(num2str([A(end) B(1)], '%d'), ' ', ''));
            if length(A)==1 || length(B)==1
                res=temp;
            else
                res=sym([A(1:end-1) temp  B(2:end)]);
            end
        end
    else
        error 'Each argument must contain only positive elements, or only negative elements, or only zeros.'
    end
else
    error 'Each argument must contain only positive elements, or only negative elements, or only zeros.'
end

Она работает корректно, но для только на небольших целых. Например, для больших аргументов получаем:
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
>> A
 
ans =
 
[ 345  577860808979686845212233454756554348078617853952]
 
>> B
 
ans =
 
[ 7740088 13]
 
>> sumWords(A,B)
 
ans =
 
[ 345, Inf, 13]

Если сразу использовать sym (для входных аргументов), то предложенная Вами конструкция "ломается":
Используется синтаксис Matlab M
>> sumWords(A,B)
Error using num2str (line 45)
Input to num2str must be numeric.

Error in sumWords (line 22)
            temp=str2num(strrep(num2str([A(end) B(1)], '%d'), ' ', ''));

Помогите "добить", плиз!)

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
Вырезать пробел как то можно в строке символов? Не работал никогда со строками((

 Re: Матлаб: есть ли простой способ конкатенации разрядов?
maximkarimov в сообщении #1625794 писал(а):
Вырезать пробел как то можно в строке символов?

Дак функция заменить strrep(S, ' ', '') как раз заменяет пробелы на пустые строки.

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


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