создать уникальное имя выходной переменной на основе имени входной переменной в Matlab

Я делаю программу в Matlab для анализа данных некоторых биомедицинских данных, которые я собрал. Вычисления действительно просты, но повторяемы, поэтому я заинтересован в написании небольшой программы. У меня есть одна матрица (200 x 99) на пациента, хранящаяся в переменной с именем пациента. Я создал функцию, результатом которой является выходная переменная (finalresult), содержащая все, что мне нужно из этой матрицы пациентов.

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

Надеюсь, вы понимаете, чего я хочу добиться. Это упрощенный пример моего кода:

function [ finalresult] = total_analysis( patientname)
    first = patientname(:,1)*2;
    second = first;
    finalresult = vertcat(first,second);
end

=> имя выходной переменной всегда finalresult

НО я хотел бы, чтобы это было "уникальное другое" имя выходной переменной, предпочтительно finalresult_patientname илиpatientname


person user1864405    schedule 29.11.2012    source источник
comment
Ммм... Имя выходной переменной в функции не имеет значения для вызывающей стороны. Что вы пытаетесь сделать на своем телефонном сайте?   -  person Edric    schedule 30.11.2012
comment
Как предполагает Эдрик, имена, используемые для определения функции, не обязательно использовать для ее вызова. Один звонок может быть patient1_result=total_analysis(patient1);. В этом весь смысл функции. Нет необходимости в переименовании.   -  person Peter    schedule 30.11.2012
comment
Рассматривали ли вы использование массива ячеек для хранения результатов и доступа к ним по индексу вместо нескольких разных переменных? Может быть удобнее, особенно если эти данные будут использоваться для дальнейшей обработки.   -  person Cavaz    schedule 30.11.2012
comment
@Бацу +1. Мне это тоже кажется самым простым. Легче даже, чем структуры. Пусть N обозначает количество пациентов. Вам потребуются только три переменные: PatientName - массив строк из N*1 ячеек, где каждая ячейка хранит имя пациента. PatientData - массив ячеек N*1, где каждая ячейка хранит матрицу данных пациентов. PatientResult - массив ячеек N*1, в каждой ячейке которого хранится результат анализа функций. Чтобы создать PatientResult, вы просто перебираете PatientData и вызываете свою функцию для каждого элемента, сохраняя вывод в соответствующем элементе PatientResult.   -  person Colin T Bowers    schedule 30.11.2012


Ответы (4)


почему бы не вернуть структуру с результатом и именем пациента?

function [ finalresult] = total_analysis( patientname)
    first = flexion(:,1)*2;
    second = first;
    finalresult.data = vertcat(first,second);
    finalresult.name = patientname;
end
person Will Faithfull    schedule 29.11.2012
comment
Я все еще сталкиваюсь с той же проблемой таким образом -> выходная переменная теперь структурирована и содержит подпеременную имя + данные, но ее имя по-прежнему является окончательным результатом. Когда я вызываю функцию для матрицы следующих пациентов, предыдущие результаты заменяются данными анализа следующих пациентов: s - person user1864405; 30.11.2012
comment
хорошо, тогда ваше имя должно происходить вне функции. Таким образом, когда вы называете переменную рабочей области, т.е. patient1_finalresult = total_analysis(patient), это место, где должно происходить переименование. Вы можете динамически назвать переменную рабочей области, используя eval и изменив строка выражения - person Will Faithfull; 30.11.2012

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

    s(1).name    = 'Jane';                      % Store patient's name here as a string
    s(1).data    = janesData;                   % Store patient's data
    s(1).result  = total_analysis( s(1).data )  % Store the analyzed data

    s(2).name    = 'John';                      % Store patient's name here as a string
    s(2).data    = johnsData;                   % Store patient's data
    s(2).result  = total_analysis( s(2).data )  % Store the analyze

И так далее для всех данных ваших пациентов. Затем вы можете просто использовать s(i), чтобы получить все переменные, связанные с i_th пациентом.

person jerad    schedule 29.11.2012
comment
Это справедливое предложение, но я думаю, что переименование выходной переменной после каждой функции будет менее трудоемким, чем хранение всего в отдельных массивах структур. Я просто подумал, что есть простая команда или что-то в этом роде, чтобы превратить имя переменной в строку и использовать ее, чтобы назвать другую переменную. Я новичок в Matlab, но очень хочу научиться :) Спасибо всем за помощь - person user1864405; 30.11.2012
comment
@user1864405 user1864405 У вас уже есть все имена пациентов, сохраненные в виде строк в одной переменной? - person jerad; 30.11.2012

Это явно плохой дизайн, но вы можете использовать функцию evalin. Что-то вроде следующего:

cmd = sprintf('result_%s = %f', suffix, result);
evalin('caller', cmd);

Затем вы вызываете свою функцию myfunc без назначения ее вывода.

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

Хорошо подходит для небольших взломов, а не для долговременного кода.

person nimrodm    schedule 30.11.2012

В дополнение к вашему комментарию, вот пример использования eval для динамического именования переменной рабочей области:

>> string = 'patient1';
>> eval(strcat(string, '_finalresult = 200'))

patient1_finalresult =

   200
person Will Faithfull    schedule 29.11.2012