Добавление определенных букв в строку MATLAB

Я специализируюсь в области нейробиологии/биомедицинской инженерии и борюсь со всем этим испытанием программирования в MATLAB, и пока что этот веб-сайт является лучшим учителем, доступным для меня прямо сейчас. В настоящее время у меня проблемы с одной из моих проблем с аппаратным обеспечением. Что мне нужно сделать, так это взять фразу, найти в ней определенное слово, затем взять в ней определенную букву и увеличить эту букву на указанное число. Другими словами:

phrase = 'this homework is so hard'
word = 'so'
letter = 'o'
factor = 5
which should give me 'This homework is sooooo hard'

Я избавился от своей основной ошибки, хотя я действительно не знаю, как это сделать. Я вышел из MATLAB, затем вернулся в него. О чудо, это волшебным образом сработало.

function[out1] = textStretch(phrase, word, letter, stretch)
searchword= strfind(phrase, word);
searchletter strfind(hotdog, letter); %Looks for the letter in the word
add = (letter+stretch) %I was hoping this would take the letter and add to it, but that's not what it does 
replace= strrep(phrase, word, add) %This would theoretically take the phrase, find the word and put in the new letter
out1 = replace

По словам учителя, функция one() может быть полезной, и мне приходится конкатенировать строки, но если я могу просто найти ее в строке и заменить, зачем мне конкатенация?


person Jessica Marie    schedule 19.09.2014    source источник
comment
у вас есть функция на пути MATLAB? или встроенная основная функция? Если нет, то это было бы причиной, по которой у вас есть функция Undefined 'textStretch' для (...)   -  person ASantosRibeiro    schedule 19.09.2014
comment
Ваш код явно не будет работать - вы не можете дать strrep букву и число и ожидать, что он будет знать, что буква будет повторяться пять раз - это замена строки, а не повторение строки. Вы также вызываете strfind дважды, а затем ничего не делаете с выводами. Мое предложение состоит в том, чтобы начать с разработки того, как начать со слова («так»), буквы («о») и цифры (5) и получить «тааак». Как только вы это сделаете, вы можете использовать strrep.   -  person nkjt    schedule 19.09.2014
comment
Он находится в том же месте, что и все остальные мои коды, поэтому я не знаю, почему сейчас он вызывает у меня проблемы.   -  person Jessica Marie    schedule 19.09.2014
comment
как указано, это не будет работать в любом случае. но это не должно быть причиной представленной ошибки. убедитесь, что вы находитесь на пути, где определена эта функция, или вы добавили этот путь к функции (например, addpath (путь к функции)   -  person ASantosRibeiro    schedule 19.09.2014
comment
@JessicaMarie Я настоятельно рекомендую вам пересмотреть имена переменных и сделать их более значимыми!   -  person Dan    schedule 19.09.2014
comment
@ASantosRibeiro Это на пути, просто кажется, что ему не нравится весь аспект «char». И мои имена переменных предназначены для моего собственного развлечения. Я комментирую и объясняю все, поэтому имена не имеют значения   -  person Jessica Marie    schedule 19.09.2014
comment
@JessicaMarie Я опубликовал один ответ о том, как вы должны использовать такую ​​функцию. Однако обратите внимание, что это не решает вашу домашнюю работу, а только проблему, которая у вас есть в настоящее время.   -  person ASantosRibeiro    schedule 19.09.2014
comment
@JessicaMarie - У тебя странное чувство юмора с именами переменных.   -  person rayryeng    schedule 19.09.2014
comment
@rayryeng ... знаешь, я даже не понял этого. Я использовал хот-дог из более раннего кода, где хотел удалить более одной гласной. Вся эта проблема должна заключаться в том, чтобы показать флирт или волнение с помощью Matlab, лол.   -  person Jessica Marie    schedule 19.09.2014
comment
@JessicaMarie - хахах, все в порядке... мне было трудно сохранять самообладание, видя, какими кокетливыми могут быть хот-доги и холодные доги, когда они обнимают друг друга. Это почти как если бы вы рассказывали историю... серьезно, возможно, переименуйте переменные, чтобы они показывали нам, что вы пытаетесь сделать. Я не думаю, что эта история представляет собой добавление букв в строку;)   -  person rayryeng    schedule 19.09.2014
comment
@rayryeng Я действительно изучаю английский язык. Я переименовал их и добавил в комментариях, что я пытался сделать со своим кодом.   -  person Jessica Marie    schedule 19.09.2014
comment
@JessicaMarie - Быть специалистом по английскому языку совершенно нормально. Спасибо за правки :)   -  person rayryeng    schedule 19.09.2014


Ответы (3)


Посмотрите, работает ли это для вас -

phrase_split = regexp(phrase,'\s','Split'); %// Split into words as cells
wordr = cellstr(strrep(word,letter,letter(:,ones(1,factor))));%// Stretched word
phrase_split(strcmp(phrase_split,word)) = wordr;%//Put stretched word into place
out = strjoin(phrase_split) %// %// Output as the string cells joined together

Примечание. Для strjoin требуется последняя версия MATLAB, которую, если она недоступна, можно получить по адресу здесь.

А можно просто использовать хак, полученный из самого m-файла -

out = [repmat(sprintf(['%s', ' '], phrase_split{1:end-1}), ...
             1, ~isscalar(phrase_split)), sprintf('%s', phrase_split{end})]

Пробный запуск -

phrase =
this homework is so hard and so boring
word =
so
letter =
o
factor =
     5
out =
this homework is sooooo hard and sooooo boring

Итак, просто оберните код в оболочку функции следующим образом:

function out = textStretch(phrase, word, letter, factor)

Формованное редактирование домашнего задания:

phrase = 'this homework is seriously hard'
word = 'seriously'
letter = 'r'
stretch = 6

out = phrase
stretched_word = letter(:,ones(1,stretch))

hotdog = strfind(phrase, word)
hotdog_st = strfind(word,letter)
start_ind = hotdog+hotdog_st-1
out(start_ind+stretch:end+stretch-1) = out(start_ind+1:end)
out(hotdog+hotdog_st-1:hotdog+hotdog_st-1+stretch-1) = stretched_word

Вывод -

out =
this homework is serrrrrriously hard

Опять же, используйте этот синтаксис для преобразования в функцию -

function out = textStretch(phrase, word, letter, stretch)
person Divakar    schedule 19.09.2014
comment
Я думаю, что основная идея заключалась в том, чтобы она могла делать домашнее задание, но это способ сделать это. - person ASantosRibeiro; 19.09.2014
comment
@ASantosRibeiro Трудно провести грань между помощью и решением. Но я понимаю вашу точку зрения, просто не знал, где остановиться :) Кроме того, по крайней мере, OP честен в этом и показал работу! - person Divakar; 19.09.2014
comment
Мне все еще нужно выяснить, почему я не могу запустить свой код, поэтому я не могу сказать, работает это или нет, но я бы предпочел использовать методы, с которыми у меня действительно есть некоторый опыт. Я не знал о cellstr или фразе_split, и хотя технически я знаю регулярное выражение, я знаю его недостаточно хорошо. Поэтому, хотя я уверен, что этот код правильный, мне не совсем удобно его использовать, но в любом случае выражаю благодарность ‹3 Это ценится - person Jessica Marie; 19.09.2014
comment
@JessicaMarie Оцените сердечные изменения! Нет ячеек или массивов ячеек, но сохранение ones, как вы сказали, может быть тем, что они ищут. Кроме того, имейте в виду, что это предназначено только для замены первого из таких слов, но вы можете изменить это, чтобы, конечно, оно работало для нескольких совпадений. - person Divakar; 19.09.2014
comment
На самом деле это работает :) Теперь я не собираюсь использовать его полностью (это вообще неудобно), но это дает мне кое-что, от чего можно уйти. Вы очень счастливы, но я уверен, что смогу следовать за ним. Я согласен с заявлением о выходе. Трудно, когда ваш учитель максимум что делал со строками, это печатал их, расплывчато показывал вам, что они делали, а затем двигался дальше или говорил о предстоящем футбольном матче. Это урок для самообучения - person Jessica Marie; 19.09.2014
comment
@JessicaMarie Вы сказали, что были взволнованы / счастливы, так что получили эти красивые имена переменных? Ну, если мне говорят, что использовать, а что нет (особенно об этом, что не разделить), я бы предпочел иметь другое отношение к этому и мог бы использовать какие-то ужасные имена переменных только для того, чтобы их разозлить! :) - person Divakar; 19.09.2014
comment
Я могу принять рекомендации, но я имею в виду, что это имена моих переменных. Ради того, чтобы люди понимали, что я делаю, я вижу важность быть немного более ясным с именами, но моя первая проблема заключалась в том, что вся функция мне не нравилась. - person Jessica Marie; 19.09.2014

Поскольку это домашнее задание, я не буду за вас все описывать, но вы были на правильном пути с strfind.

a = strfind(phrase, word); 
b = strfind(word, letter); 

Что возвращает phrase(1:a)? Что возвращает phrase(a+b:end)?

Сделайте несколько предположений о том, почему ваш учитель хочет, чтобы вы использовали ones:

Что возвращает num = double('o')? Что возвращает char(num)? Как насчет char([num num])?

Вы можете объединить строки следующим образом:

out = [phrase(1:a),'ooooo',phrase(a+b:end)];

Итак, все, на чем вам действительно нужно сосредоточиться, это как получить строку, которая повторяется letter factor раз.

Если вы хотите вместо этого использовать strrep, вам нужно будет указать полное слово, которое вы ищете, и копию этого слова с повторяющимися буквами в:

 new_phrase = strrep(phrase, 'so', 'sooooo');

Опять же, проблема в том, как получить строку «оооооо».

person nkjt    schedule 19.09.2014
comment
фраза (1: а) должна дать мне слово, которое я хочу. фраза (a+b:end) должна дать мне Мое слово и мое письмо. num = double('o') должен дать мне 'o'? char(num) превращает его в символ. char([num num]) превращает его в массив? ТА намекнули, что strrep будет правильным способом сделать это. Я все еще не уверен в том, где они() появляются. Если только это не связано с моим фактором. - person Jessica Marie; 19.09.2014
comment
Нет на индексацию в phrase. Прочтите документацию по strfind еще раз или попробуйте ее в командной строке. Нет на double - опять же, прочитайте документы на double/char. ones появляется, когда вы пытаетесь построить массив символов произвольного размера (на основе фактора). - person nkjt; 19.09.2014
comment
strfind дает мне векторы/индексы того, что я ищу. Double и char — это разные триггеры для MATLAB. Я думал, что характер для подобных строк. Поэтому я бы использовал те, у которых есть фактор. Хорошо - person Jessica Marie; 19.09.2014

Ну, Джессика, во-первых, это НЕПРАВИЛЬНО, но я здесь не для того, чтобы дать вам решение. Не могли бы вы просто использовать это таким образом? Это наверняка бег.

function main_script()
phrase = 'this homework is so hard';
word = 'so';
letter = 'o';
factor = 5;
[flirty] = textStretchNEW(phrase, word, letter, factor)
end

function [flirty] = textStretchNEW(phrase, word, letter, stretch)
hotdog = strfind(phrase, word);
colddog = strfind(hotdog, letter);
add = letter + stretch;
hug = strrep(phrase, word, add);
flirty = hug
end
person ASantosRibeiro    schedule 19.09.2014
comment
Это не работает. Я проверил свои пути, я дважды изменил свой путь. Это не будет работать. - person Jessica Marie; 19.09.2014
comment
@JessicaMarie ту, которую я опубликовала? скопируйте это в новый файл. сохраните его и назовите main_script.m. затем запустите его с помощью F5 - person ASantosRibeiro; 19.09.2014
comment
›› main_script Неопределенная функция textStretch для входных аргументов типа char. - person Jessica Marie; 19.09.2014
comment
вы только что вставили это в командную строку? или вы сделали файл с этим и запустили его? - person ASantosRibeiro; 19.09.2014
comment
хорошо, теперь у вас могут быть некоторые конфликтующие функции. измените свой файл в соответствии с тем, что я отредактировал в этом сообщении - person ASantosRibeiro; 19.09.2014