Que dicas gerais você tem para jogar golfe no MATLAB? Estou procurando idéias que possam ser aplicadas aos problemas de código de golfe em geral que sejam pelo menos um pouco específicos do MATLAB (por exemplo, "remover comentários" não é uma resposta). Poste uma dica por resposta.
14
Respostas:
Algo que se deve saber antes de começar a jogar golfe:
Nos cálculos do MATLAB, um caractere se comporta da mesma forma que seu código ascii.
fonte
Encurtando nomes de propriedades
No MATLAB, cadeias de caracteres que identificam propriedades podem ser reduzidas desde que não resultem em ambiguidade.
Isso realmente me ganhou um desafio :)
fonte
name, value
pares, como mostrado acima. (Então, não a coisas comosort(rand(4,1),'descend')
)conv(1:5,[1 1],'s')
vez deconv(1:5,[1 1],'same')
A conversão como char pode ser feita por concatenação com um char:
Embora ele salve apenas um caractere, isso pode ser usado com bastante frequência.
fonte
Strings são apenas vetores de linha de caracteres. Isso significa que, em vez de
você pode simplesmente escrever
Primeira vez que usei isso: /codegolf//a/58387/32352
fonte
Raízes da unidade via transformada discreta de Fourier
Dado um número inteiro positivo
n
, a maneira padrão de gerar asn
-ésimas raízes da unidade éIsso fornece as raízes começando
1
e se movendo na direção angular positiva. Se a ordem não importa, isso pode ser reduzido paraComo
exp(2j*pi/4)
é igual à unidade imaginária (j
), isso pode ser escrito de forma mais compacta da seguinte maneira (truque devido a @flawr ):ou
Mas a transformação discreta de Fourier fornece uma maneira ainda mais curta (graças a @flawr por remover dois parênteses desnecessários):
que dá as raízes começando
1
e se movendo na direção angular positiva; ouque começa
1
e se move na direção angular negativa.Tente todas as opções acima aqui .
fonte
fft(1:n==2)
Iteração sobre vetores em matrizes.
Dado um conjunto de vetores como matriz, é possível iterar sobre eles por meio de um único loop for, como
enquanto "tradicionalmente" você provavelmente teria feito isso
Só aprendi sobre esse truque agora com o @Suever neste desafio .
fonte
Dicas relacionadas, mas não idênticas, para o Octave .
Um recurso pouco conhecido e pouco usado do MATLAB e do Octave é que a maioria das funções internas pode ser chamada sem parênteses, caso em que tratará o que quer que se segue como uma string (desde que não contenha espaços). Se ele contiver espaços, você precisará de aspas. Isso pode ser usado frequentemente para salvar um byte ao usar
disp
:Outros exemplos menos úteis incluem:
Na verdade, eu usei isso duas vezes no "Quão alto você pode contar?" -desafio:
é equivalente a
strchr('sssssssssssssst','t')
e retorna15
.é equivalente a
nnz('nnnnnnnnnnnnnn')
e retorna14
.Coisas como
gt r s
funciona também (equivalente a'r'>'s'
ougt('r','s')
.fonte
nnz
Às vezes, você pode economizar alguns bytes:A
. Em vez desum(sum(A))
ousum(A(:))
, você pode usarnnz(a)
(nnz
aplica-se de forma implícita(:)
).numel(x)
usarnnz(x)
. Isso é aplicável, por exemplo, sex
for uma string.fonte
Núcleos de convolução 2D
Talvez este seja um tópico de nicho, mas aparentemente algumas pessoas gostam de usar a convolução para várias coisas aqui. [citação necessária]
Em 2D, os seguintes kernels são frequentemente necessários:
Isso pode ser alcançado usando
que é mais curto que
Outro kernel frequentemente usado é
que pode ser reduzido usando
fonte
toeplitz([0 1 0])
Muitas vezes me pego usando
meshgrid
oundgrid
, digamos, queremos computar uma imagem de mandelbrot, depois inicializamos, por exemplo,Agora, para o conjunto de Mandelbrot precisamos de uma outra matriz
c
do tamanhox
ey
mas inicializado com zeros. Isso pode ser feito facilmente escrevendo:Você também pode inicializá-lo para outro valor:
Mas você pode salvar alguns bytes apenas adicionando outra dimensão em
meshgrid/ndgrid
:E você pode fazer isso quantas vezes quiser:
fonte
O built-in
ones
ezeros
são tipicamente um desperdício de espaço. Você pode obter o mesmo resultado simplesmente multiplicando uma matriz / matriz (do tamanho desejado) por 0 (para obter a saída dezeros
) e adicione 1 se desejar a saída deones
.Isso também funciona se você deseja criar um vetor de coluna ou linha de zeros ou do tamanho de uma dimensão de uma matriz.
Se você deseja criar uma matriz de um tamanho específico, pode usar,
zeros
mas também pode atribuir o último elemento a 0 e fazer com que o MATLAB preencha o restante.fonte
~(1:n)
para vetores zero 1-d.Soma de uma sequência de funções
Para somar as funções f (x_n) em que n é um vetor de números inteiros consecutivos, feval é recomendado em vez de symsum.
Observe que uma operação elementar
.*
e./
é necessária em vez de operações binárias em pares*
e/
Se a função puder ser escrita ingenuamente, ninguém das duas últimas maneiras é adequado.
por exemplo, se a função for,
log
você pode simplesmente fazer:,sum(log(1:n))
que representa:para funções relativamente sofisticadas, como
log(n)/x^n
você pode fazer:e ainda mais curto em alguns casos quando uma função é maior que
f(x)=e^x+sin(x)*log(x)/x
....que é notavelmente mais curto que
sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
Nota: Esse truque pode ser aplicado a outros operadores inclusivos como
prod
oumean
fonte