Как изящно проигнорировать некоторые возвращаемые значения функции MATLAB?

Мы можем сделать 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)
117
задан Minhas Kamal 20 March 2016 в 06:29
поделиться

6 ответов

Это что-то вроде хака, но это работает:

Сначала быстрый пример функции:

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 .

38
ответ дан Community 24 November 2019 в 02:04
поделиться

Вот еще один вариант, который вы можете использовать. Сначала создайте массив ячеек для захвата всех выходов (вы можете использовать функцию 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
13
ответ дан glglgl 24 November 2019 в 02:04
поделиться

Если вы хотите использовать стиль, в котором переменная будет оставлена ​​для попадания в область битов, то разумная альтернатива is

[ans,ans,variableThatIWillUse] = myfun(inputs);

ans - это, конечно, стандартная переменная нежелательной почты для matlab, которая часто перезаписывается в ходе сеанса.

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

37
ответ дан 24 November 2019 в 02:04
поделиться

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.

9
ответ дан 24 November 2019 в 02:04
поделиться

С MATLAB версии 7.9 (R2009b) вы можете использовать ~, например,

[~, ~, variableThatIWillUse] = myFunction();

Обратите внимание, что , не являются необязательными. Простой ввод [~ ~ var] не будет работать и вызовет ошибку.

Подробнее см. примечания к выпуску .

225
ответ дан 24 November 2019 в 02:04
поделиться

В Matlab 2010a я нашел изящный способ делать то, что вы просите. Просто использовать символ «~» (конечно, без кавычек) в качестве фиктивной переменной (сколько угодно при возврате нескольких параметров). Это также работает для входных параметров функций, если функции предназначены для обработки отсутствующих данных. Я не знаю, существовало ли это в предыдущих версиях, но я недавно столкнулся с этим.

4
ответ дан 24 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: