Мы можем сделать gather
для «val1», «val2» для преобразования данных в «длинный» формат, unite
столбцы «key», «type» в один столбец, а затем spread
для «широкий» формат
library(tidyverse)
gather(mydf, key, val, val1:val2) %>%
unite(key, key, type, sep=".") %>%
spread(key, val, fill = 0)
Это что-то вроде хака, но это работает:
Сначала быстрый пример функции:
Func3 = @() deal(1,2,3);
[a,b,c]=Func3();
% yields a=1, b=2, c=3
Теперь Ключевым моментом здесь является то, что если вы используете переменную дважды в левой части назначения с несколькими выражениями, более раннее назначение перекрывается более поздним назначением:
[b,b,c]=Func3();
% yields b=2, c=3
[c,c,c]=Func3();
% yields c=3
(редактировать: просто для проверки, я также проверил, что этот метод работает с [mu, mu, mu] = polyfit (x, y, n)
, если все, что вам нужно из polyfit
, является третьим аргументом)
edit есть лучший подход; см. вместо ответ ManWithSleeve .
Вот еще один вариант, который вы можете использовать. Сначала создайте массив ячеек для захвата всех выходов (вы можете использовать функцию NARGOUT , чтобы определить, сколько выходов возвращает данная функция):
a = cell(1,3); % For capturing 3 outputs
% OR...
a = cell(1,nargout(@func)); % For capturing all outputs from "func"
Затем вызвать функцию следующим образом:
[a{:}] = func();
Затем просто удалить элемент из a , который вы хотите, и перезаписать a :
a = a{3}; % Get the third output
Если вы хотите использовать стиль, в котором переменная будет оставлена для попадания в область битов, то разумная альтернатива is
[ans,ans,variableThatIWillUse] = myfun(inputs);
ans - это, конечно, стандартная переменная нежелательной почты для matlab, которая часто перезаписывается в ходе сеанса.
Хотя мне нравится новый трюк, который теперь позволяет MATLAB, используя ~ для обозначения игнорируемой возвращаемой переменной, это проблема обратной совместимости, так как пользователи старых версий не смогут использовать ваш код. Я обычно избегаю использовать такие вещи, пока не будет выпущено по крайней мере несколько выпусков MATLAB, чтобы гарантировать, что в беде останется очень мало пользователей. Например, даже сейчас я нахожу, что люди все еще используют достаточно старую версию MATLAB, чтобы они не могли использовать анонимные функции.
I wrote a kth out function:
function kth = kthout(k,ffnc,varargin)
%% kthout: take the kth varargout from a func call %FOLDUP
%
% kth = kthout(k,ffnc,varargin)
%
% input:
% k which varargout to get
% ffnc function to call;
% varargin passed to ffnc;
% output:
% kth the kth argout;
% global:
% nb:
% See also:
% todo:
% changelog:
%
%% %UNFOLD
[outargs{1:k}] = feval(ffnc,varargin{:});
kth = outargs{k};
end %function
you can then call
val_i_want = kthout(3,@myfunc,func_input_1,func_input_2); %etc
you could also wrap up the function like
func_i_want = @(varargin)(kthout(3,@myfunc,varargin{:})); %assuming you want the 3rd output.
after which you use
val_i_want = func_i_want(func_input_1,func_input_2);
note that there is overhead associated with using anonymous functions like this, and this is not something I would do in code that would be called thousands of times.
С MATLAB версии 7.9 (R2009b) вы можете использовать ~, например,
[~, ~, variableThatIWillUse] = myFunction();
Обратите внимание, что ,
не являются необязательными. Простой ввод [~ ~ var]
не будет работать и вызовет ошибку.
Подробнее см. примечания к выпуску .
В Matlab 2010a я нашел изящный способ делать то, что вы просите. Просто использовать символ «~» (конечно, без кавычек) в качестве фиктивной переменной (сколько угодно при возврате нескольких параметров). Это также работает для входных параметров функций, если функции предназначены для обработки отсутствующих данных. Я не знаю, существовало ли это в предыдущих версиях, но я недавно столкнулся с этим.