Возможно ли получить возвращаемое значение n-го значения из функции без необходимости создавать n-1
перед ним фиктивные переменные для всех возвращаемых значений?
Скажем, у меня в MATLAB есть следующая функция:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
Теперь предположим, что меня интересует только третье возвращаемое значение. Это можно сделать, создав одну фиктивную переменную:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
Но я считаю это некрасивым . Я бы подумал, что вы могли бы сделать что-то вроде одной из следующих вещей, но вы не можете:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
Есть ли какие-нибудь изящные способы сделать это, которые действительно работают?
Пока что лучшим решением будет просто использовать variableThatIWillUse
переменную как фиктивную. Это избавляет меня от необходимости создавать настоящую фиктивную переменную, которая загрязняет рабочее пространство (или которую мне нужно будет очистить). Вкратце: решение состоит в том, чтобы использовать variableThatIWillUse
для каждого возвращаемого значения вплоть до интересующего. Возвращаемые значения после можно просто игнорировать:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
Я все еще считаю, что это очень уродливый код, но если нет лучшего способа, я думаю, что приму ответ.
источник
Ответы:
Это своего рода взлом, но он работает:
Сначала быстрый пример функции:
Ключевым моментом здесь является то, что если вы дважды используете переменную в левой части присвоения множественных выражений, более раннее присвоение затирается последующим назначением:
(править: просто для проверки, я также подтвердил, что этот метод работает,
[mu,mu,mu]=polyfit(x,y,n)
если все, что вас волнует,polyfit
- это третий аргумент)изменить: есть лучший подход; вместо этого см . ответ ManWithSleeve .
источник
С MATLAB версии 7.9 (R2009b) вы можете использовать ~, например,
Обратите внимание, что
,
это не обязательно. Просто печатать[~ ~ var]
не получится и выдаст ошибку.См. Подробности в примечаниях к выпуску .
источник
not
оператора as indon't care
тоже не так уж плохо,
это не обязательно. Просто набрав[~ ~ var]
будет не работать, и выдаст ошибку.Если вы хотите использовать стиль, в котором переменная будет оставлена для попадания в битовое ведро, то разумной альтернативой будет
ans - это, конечно, нежелательная переменная по умолчанию для Matlab, которая часто перезаписывается в ходе сеанса.
Хотя мне действительно нравится новый трюк, который теперь позволяет MATLAB, используя ~ для обозначения игнорируемой возвращаемой переменной, это проблема обратной совместимости, поскольку пользователи более старых версий не смогут использовать ваш код. Я обычно избегаю использования таких новых вещей до тех пор, пока не будет выпущено хотя бы несколько выпусков MATLAB, чтобы гарантировать, что в беде останется очень мало пользователей. Например, даже сейчас я обнаружил, что люди все еще используют достаточно старую версию MATLAB, которая не может использовать анонимные функции.
источник
Вот еще один вариант, который вы можете использовать. Сначала создайте массив ячеек для захвата всех выходов (вы можете использовать функцию NARGOUT, чтобы определить, сколько выходов возвращает данная функция):
Затем вызовите функцию следующим образом:
Затем просто удалить элемент из , что вы хотите, и перезаписать :
источник
Я написал функцию kth out:
тогда вы можете позвонить
вы также можете завершить функцию, например
после чего вы используете
обратите внимание, что существуют накладные расходы, связанные с использованием подобных анонимных функций, и это не то, что я бы делал в коде, который будет вызываться тысячи раз.
источник
В Matlab 2010a я нашел изящный способ делать то, о чем вы просите. Просто использовать символ «~» (конечно, без кавычек) в качестве фиктивной переменной (сколько угодно при возврате нескольких параметров). Это также работает для входных параметров функций, если функции предназначены для обработки отсутствующих данных. Я не знаю, существовало ли это в предыдущих версиях, но я недавно столкнулся с этим.
источник
Вы можете создать функцию (или анонимную функцию), которая возвращает только выбранные выходы, например
Затем вы можете вызвать свою функцию следующим образом:
Или вы можете назначить вывод переменной:
источник
decimatedfftx = select(fft(x,12),1:4:12);
select(func,2)
звонкиfunc(2)
. Я не вижу, где это выбирает выходные аргументы.Есть ли причина не использовать ans (n), например:
Дает b = 10, и будет ли этот способ совместим со всеми версиями Matlab?
Более того, это работает для получения второго выходного аргумента, когда вы не знаете, сколько аргументов будет! В то время как, если вы сделаете это:
Тогда b = 8000! (Вам нужно заканчивать на ~, чтобы поймать больше аргументов!)
источник
size(a)
и[b,c]=size(a)
вернуть разные вещи. Функции в MATLAB изменяют поведение на основе количества выходных аргументов.