Какие общие советы у вас есть для игры в гольф в MATLAB? Я ищу идеи, которые могут быть применены к задачам по коду для гольфа в целом, которые, по крайней мере, несколько специфичны для MATLAB (например, «удалить комментарии» - это не ответ). Пожалуйста, оставьте один совет за ответ.
14
Ответы:
Что-то, что нужно знать перед началом игры в гольф:
В вычислениях MATLAB символ ведет себя так же, как и его код ascii.
источник
Сокращение имен свойств
В MATLAB строки, идентифицирующие свойства, могут быть сокращены до тех пор, пока это не приведет к неоднозначности.
Это на самом деле победило меня :)
источник
name, value
пар, как показано выше. (Так не к таким вещам, какsort(rand(4,1),'descend')
)conv(1:5,[1 1],'s')
вместоconv(1:5,[1 1],'same')
Приведение в качестве char может быть выполнено путем конкатенации с char:
Хотя он сохраняет только один символ, его можно использовать довольно часто.
источник
Строки - это просто векторы строк символов. Это означает, что вместо
ты можешь просто написать
Впервые я использовал это: /codegolf//a/58387/32352
источник
Корни единства с помощью дискретного преобразования Фурье
Учитывая положительное целое число
n
, стандартный способ для генерацииn
-х корней из единицы являетсяЭто дает корни, начинающиеся
1
и движущиеся в положительном угловом направлении. Если порядок не имеет значения, его можно сократить доТак как
exp(2j*pi/4)
равен мнимой единице (j
), это можно записать более компактно следующим образом (трюк из-за @flawr ):или
Но дискретное преобразование Фурье обеспечивает еще более короткий путь (спасибо @flawr за удаление двух ненужных скобок):
который дает корни, начинающиеся
1
и движущиеся в положительном угловом направлении; иликоторый начинается в
1
и движется в отрицательном угловом направлении.Попробуйте все вышеперечисленное здесь .
источник
fft(1:n==2)
nnz
Иногда может сэкономить вам несколько байтов:A
. Вместоsum(sum(A))
илиsum(A(:))
, вы можете использоватьnnz(a)
(nnz
имплицитно применяется(:)
).numel(x)
вы можете использовать ихnnz(x)
. Это применимо, например, еслиx
это строка.источник
Итерация по векторам в матрицах.
Учитывая набор векторов в качестве матрицы, вы можете фактически перебирать их через один цикл for, как
в то время как "традиционно" вы, вероятно, сделали бы это как
Я только что узнал об этом трюке от @Suever в этом испытании .
источник
Связанные, но не идентичные советы для Octave .
Малоизвестная и мало используемая особенность MATLAB и Octave заключается в том, что большинство встроенных функций можно вызывать без скобок, и в этом случае они будут обрабатывать все, что следует за ней, как строку (если только она не содержит пробелов). Если он содержит пробелы, вам нужны кавычки. Это часто можно использовать для сохранения байта при использовании
disp
:Другие, менее полезные примеры включают в себя:
Я фактически использовал это дважды в "Как высоко вы можете сосчитать?" -вызов:
эквивалентно
strchr('sssssssssssssst','t')
и возвращает15
.эквивалентно
nnz('nnnnnnnnnnnnnn')
и возвращает14
.Вещи как
gt r s
работает тоже (эквивалентно'r'>'s'
илиgt('r','s')
.источник
Встроенный
ones
иzeros
, как правило, пустая трата пространства. Вы можете достичь того же результата, просто умножив массив / матрицу (нужного размера) на 0 (чтобы получить результатzeros
) и добавив 1, если вы хотите получить результатones
.Это также работает, если вы хотите создать столбец или вектор строки из нулей или единиц размером одного размера матрицы.
Если вы хотите создать матрицу определенного размера, вы можете использовать ее,
zeros
но вы также можете просто присвоить последнему элементу значение 0 и заполнить все остальные MATLAB.источник
~(1:n)
для 1-й нулевой векторов.2D ядра свертки
Возможно, это нишевая тема, но, очевидно, некоторым людям здесь нравится использовать свертку для разных вещей. [нужна цитата]
В 2D часто нужны следующие ядра:
Это может быть достигнуто с помощью
который короче
Другое часто используемое ядро
который может быть сокращен с помощью
источник
toeplitz([0 1 0])
Я довольно часто использую
meshgrid
илиndgrid
, скажем, мы хотим вычислить изображение Мандельброта, а затем инициализируем, например:Теперь для множества Мандельброта нам нужна еще одна матрица
c
размеромx
и,y
но инициализированная нулями. Это легко сделать, написав:Вы также можете инициализировать его другим значением:
Но вы можете сохранить некоторые байты, просто добавив другое измерение в
meshgrid/ndgrid
:И вы можете делать это так часто, как вы хотите:
источник
x=-2:1d-2:1;y=x'
.Суммирование последовательности функций
Для суммирования функций f (x_n), где n - вектор последовательных целых чисел, рекомендуется использовать feval, а не symsum.
Обратите внимание, что элементарная операция
.*
и./
необходима вместо попарно бинарных операций*
и/
Если функция может быть написана наивно, ни один из последних способов не подходит.
например, если функция,
log
вы можете просто сделать:,sum(log(1:n))
который представляет:для относительно сложных функций, как
log(n)/x^n
вы можете сделать:и даже короче в некоторых случаях, когда функция длиннее, чем
f(x)=e^x+sin(x)*log(x)/x
....это заметно короче
sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
Примечание: этот трюк может быть применен к другим инклюзивным операторам как
prod
илиmean
источник