Как поместить значения переменных в текстовую строку в MATLAB? - PullRequest
12 голосов
/ 05 февраля 2010

Я пытаюсь написать простую функцию, которая принимает два ввода x и y и передает их трем другим простым функциям, которые складывают, умножают и делят их. Затем основная функция должна отображать результаты в виде строки, содержащей x, y и итоги.

Я думаю, что есть что-то, чего я не понимаю в выходных аргументах. Во всяком случае, вот мой (жалкий) код:

function a=addxy(x,y)
a=x+y;

function b=mxy(x,y)
b=x*y;

function c=dxy(x,y)
c=x/y;

Основная функция:

function [d e f]=answer(x,y)
d=addxy(x,y);
e=mxy(x,y);
f=dxy(x,y);
z=[d e f]

Как получить значения для x, y, d, e и f в строку? Я пробовал разные матрицы и тому подобное:

['the sum of' x 'and' y 'is' d]

но ни одна из переменных не отображается.

Два дополнительных выпуска:

  • Почему функция возвращает "ans 3", хотя я не просил длину z?
  • Если бы кто-нибудь мог порекомендовать хорошую книгу для начинающих по написанию сценариев MATLAB, я был бы очень признателен.

Ответы [ 5 ]

16 голосов
/ 05 февраля 2010

Вот как вы конвертируете числа в строки и соединяете строки с другими вещами (это странно):

>> ['the number is ' num2str(15) '.']
ans =
the number is 15.
8 голосов
/ 05 февраля 2010

Вы можете использовать fprintf / sprintf со знакомым синтаксисом Си. Может быть что-то вроде:

fprintf('x = %d, y = %d \n x+y=%d \n x*y=%d \n x/y=%f\n', x,y,d,e,f)

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

x = 2;
y = 2;
[d e f] = answer(x,y);
fprintf('%d + %d = %d\n', x,y,d)
fprintf('%d * %d = %d\n', x,y,e)
fprintf('%d / %d = %f\n', x,y,f)

Также для функции answer () можно назначить выходные значения для вектора вместо трех различных переменных:

function result=answer(x,y)
result(1)=addxy(x,y);
result(2)=mxy(x,y);
result(3)=dxy(x,y);

и назовите это просто:

out = answer(x,y);
4 голосов
/ 05 февраля 2010

Как показывают Peter и Amro , сначала необходимо преобразовать числовые значения в форматированные строки, чтобы отобразить их или объединить с другими символьными строками. Это можно сделать с помощью функций FPRINTF , SPRINTF , NUM2STR и INT2STR .


Что касается получения ans = 3 в качестве вывода, это, вероятно, связано с тем, что вы не присваиваете вывод из answer переменной. Если вы хотите получить все выходные значения, вам нужно будет вызвать answer следующим образом:

[out1,out2,out3] = answer(1,2);

Это поместит значение d в out1, значение e в out2 и значение f в out3. Когда вы делаете следующее:

answer(1,2)

MATLAB автоматически назначит первый выход d (который в данном случае имеет значение 3) переменной рабочей области по умолчанию ans.


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

3 голосов
/ 06 февраля 2010

Я только что понял, почему у меня так много проблем - в MATLAB вы не можете хранить строки различной длины в виде массива, используя квадратные скобки. Использование квадратных скобок объединяет строки различной длины в один массив символ .

    >> a=['matlab','is','fun']

a =

matlabisfun

>> size(a)

ans =

     1    11

В массиве символов каждый символ в строке считается одним элементом, что объясняет, почему размер a равен 1X11.

Чтобы хранить строки различной длины в качестве элементов массива, необходимо использовать фигурные скобки для сохранения в виде массива ячеек. В массивах ячеек каждая строка обрабатывается как отдельный элемент независимо от длины.

>> a={'matlab','is','fun'}

a = 

    'matlab'    'is'    'fun'

>> size(a)

ans =

     1     3
0 голосов
/ 01 октября 2012

Я искал что-то вместе с тем, что вы хотели, но хотел поместить это обратно в переменную.

Так вот что я сделал

variable = ['hello this is x' x ', this is now y' y ', finally this is d:' d]

в основном

variable = [str1 str2 str3 str4 str5 str6]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...