Как поменять элементы в векторе, используя анонимную функцию в Octave?


15

Поменять местами два элемента в векторе / матрице в Octave очень просто:

x='abcde';
x([4,1])=x([1,4])
x = 
   dbcae

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

f=@(x)(x([4,1])=x([1,4]))
f(x)
ans = 
     ad

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

Я мог бы создать индексный вектор:, f=@(x)x([4,2,3,1,5])но динамическое создание такого вектора, вероятно, также займет много байтов.


Ответы:


21

Список аргументов

f=@(x,y=x([4 1])=x([1 4]))x;

Попробуйте онлайн!


5
Подожди что ? Я никогда не знал, что это возможно в Октаве. Это открывает так много новых техник ....
Sanchises

4
Что в ...?
Стьюи Гриффин

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

3
Удивительный. Кстати, вы можете удалить финал ;в целях подсчета байтов
Луис Мендо

Спасибо всем. @ Sanchises Кажется, что Octave - это шокирующий язык. Быть осторожен! Это добавлено к подсказкам.
rahnema1

11

Быть eval

f=@(x)eval"x([4 1])=x([1 4])"

Попробуйте онлайн!


В Matlab скобки не могут быть опущены:

f=@(x)eval('x([4 1])=x([1 4])')

9
Ответ только на PPCG eval:-)
Стьюи Гриффин,

Вы хотите добавить это к вопросу о советах Octave? forЦикл внутри анонимной функции, evalсохраняя там много байтов, и, вероятно, может сделать это и во многих других задачах,
Stewie Griffin,

Не уверен, что это когда-нибудь в гольфе, но я полагаю, что вы можете сделать это даже без анонимной функции: s='x([1 4])=x([4 1])';eval(s)- Я полагаю, это в основном интересно, если вы уже сделали функцию для выполнения eval с минимальным количеством символов.
Деннис Джаэруддин


2
Я думаю, что таким ответом является единственный ответ, который является действительным и для Octave, и для Matlab.
Бэтмен

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.