2016-10-07 8 views
1

Я пытаюсь определить следующую функцию в MATLAB:Создание функции с переменным количеством входов?

file = @(var1,var2,var3,var4) ['var1=' num2str(var1) 'var2=' num2str(var2) 'var3=' num2str(var3) 'var4=' num2str(var4)']; 

Однако, я хочу, чтобы функция расширения, как добавить больше параметров; если я хотел бы добавить переменную vark, я хочу, чтобы функция быть:

file = @(var1,var2,var3,var4,vark) ['var1=' num2str(var1) 'var2=' num2str(var2) 'var3=' num2str(var3) 'var4=' num2str(var4) 'vark=' num2str(vark)']; 

Есть ли систематический способ сделать это?

+1

Вы не собираетесь использовать выходы с 'eval' позже, правильно ...? –

+0

Пожалуйста, подумайте о принятии одного из ответов, если они решили вашу проблему. Это галочка в левой части ответа. Благодаря! :) –

ответ

2

fprintf Использование с varargin для этого:

f = @(varargin) fprintf('var%i= %i\n', [(1:numel(varargin));[varargin{:}]]) 
f(5,6,7,88) 
var1= 5 
var2= 6 
var3= 7 
var4= 88 

Формат Я использовал это: 'var%i= %i\n'. Это означает, что он сначала напишет var, тогда %i говорит, что он должен ввести целое число. После этого он должен написать =, а затем новый номер: %i и новую строку \n.

Он выберет целое число в нечетных положениях для var%i и целые числа в четных положениях для действительного числа. Так как линейный индекс в MATLAB переходит в столбец для столбца, мы помещаем вектор [1 2 3 4 5 ...] сверху и содержимое переменной во второй строке.

Кстати: Если вы на самом деле хотите от формата, указанного в вопросе, пропустите \n:

f = @(varargin) fprintf('var%i= %i', [(1:numel(varargin));[varargin{:}]]) 

f(6,12,3,15,5553) 
var1= 6var2= 12var3= 3var4= 15var5= 5553 

Кроме того, вы можете change the second %i to floats (%f), doubles (%d) etc.

Если вы хотите использовать фактические имена переменных var1, var2, var3, ... на вашем входе тогда я могу только сказать одно: Не надо! Это ужасная идея. Используйте ячейки, структуры или что-то еще, кроме пронумерованных имен переменных.

Просто для того, чтобы быть плавным: не используйте вывод из этого в MATLAB в сочетании с eval! eval is evil. Mathworks фактически предупреждает вас об этом в официальной документации!

0

Если вы хотите, чтобы функция принимала гибкое количество входных аргументов, вам нужно varargin.

Если вы хотите, чтобы конечная строка была составлена ​​из имен ваших переменных, как в вашем рабочем пространстве, я не нашел пути, так как вам нужно varargin, а затем это выглядит невозможно. Но если вы все в порядке с наличием var1, var2 в вашей строке, вы можете определить эту функцию, а затем использовать его:

function str = strgen(varargin) 
str = ''; 
for ii = 1:numel(varargin); 
    str = sprintf('%s var%d = %s', str, ii, num2str(varargin{ii})); 
end 
str = str(2:end); % to remove the initial blank space 

Он также совместим со строками. Тестирование:

% A = pi; 
% B = 'Hello!'; 

strgen(A, B) 

ans = 

var1 = 3.1416 var2 = Hello! 
0

Как насчет вызова функции столько раз, сколько количество параметров? Я написал это с учетом конкретной формы символьной строки, возвращаемой вашей функцией, где k считается индексом переменной «kth», которую нужно ввести. Array var может быть списком ваших числовых параметров.

[email protected](var,i)[strcat('var',num2str(i),'=') num2str(var) ]; 

var=[2,3,4,5]; 

str=''; 

for i=1:length(var); 

str=strcat(str,file(var(i),i)); 

end