Jakie masz ogólne wskazówki na temat gry w golfa w MATLAB? Szukam pomysłów, które można by zastosować do problemów z golfem w kodzie, które są przynajmniej nieco specyficzne dla MATLAB (np. „Usuń komentarze” nie jest odpowiedzią). Proszę zamieścić jedną wskazówkę na odpowiedź.
14
Odpowiedzi:
Coś, co trzeba wiedzieć przed rozpoczęciem gry w golfa:
W obliczeniach MATLAB znak zachowuje się tak samo jak kod ascii.
źródło
Skracanie nazw nieruchomości
W MATLAB ciągi identyfikujące właściwości można skracać, o ile nie powoduje to niejednoznaczności.
To faktycznie dało mi wyzwanie :)
źródło
name, value
par, jak pokazano powyżej. (Więc nie do rzeczy takich jaksort(rand(4,1),'descend')
)conv(1:5,[1 1],'s')
zamiastconv(1:5,[1 1],'same')
Rzucanie jako char można wykonać przez konkatenację z char:
Chociaż oszczędza tylko jeden znak, można go używać dość często.
źródło
Ciągi są tylko wektorami wierszy znaków. Oznacza to, że zamiast
możesz po prostu pisać
Pierwszy raz użyłem tego: /codegolf//a/58387/32352
źródło
Korzenie jedności poprzez dyskretną transformatę Fouriera
Biorąc pod uwagę dodatnią liczbę całkowitą
n
, standardowym sposobem generowanian
-tego korzenia jedności jestTo daje korzenie zaczynające się
1
i poruszające w dodatnim kierunku kątowym. Jeśli kolejność nie ma znaczenia, można to skrócićPonieważ
exp(2j*pi/4)
jest równa jednostce urojonej (j
), można to zapisać w bardziej zwięzły sposób (sztuczka z powodu @flawr ):lub
Ale dyskretna transformata Fouriera zapewnia jeszcze krótszą drogę (dzięki @flawr do usunięcia dwóch niepotrzebnych nawiasów):
co daje korzenie rozpoczynające się
1
i poruszające w dodatnim kierunku kątowym; lubktóry zaczyna się
1
i porusza w ujemnym kierunku kątowym.Wypróbuj wszystkie powyższe tutaj .
źródło
fft(1:n==2)
nnz
może czasami zaoszczędzić kilka bajtów:A
. Zamiastsum(sum(A))
lubsum(A(:))
możesz użyćnnz(a)
(nnz
domyślnie dotyczy(:)
).numel(x)
możesz użyćnnz(x)
. Dotyczy to na przykładx
ciągów znaków.źródło
Iteracja nad wektorami w macierzach.
Biorąc pod uwagę zbiór wektorów jako macierzy, możesz iterować po nich za pomocą pojedynczej pętli for jak
podczas gdy „tradycyjnie” prawdopodobnie zrobiłbyś to tak
Właśnie dowiedziałem się o tej sztuczce od @Suever w tym wyzwaniu .
źródło
Powiązane, ale nie identyczne wskazówki dla Octave .
Mało znaną i mało używaną cechą MATLAB i Octave jest to, że większość wbudowanych funkcji można wywoływać bez nawiasów, w którym to przypadku będą traktować wszystko, co następuje po nim, jako ciąg znaków (o ile nie zawiera spacji). Jeśli zawiera spacje, potrzebujesz cudzysłowu. Można to często wykorzystać do zapisania bajtu przy użyciu
disp
:Inne, mniej przydatne przykłady to:
Użyłem tego dwukrotnie w „Jak wysoko możesz liczyć?” -wyzwanie:
jest równoważne
strchr('sssssssssssssst','t')
i zwraca15
.jest równoważne
nnz('nnnnnnnnnnnnnn')
i zwraca14
.Takie rzeczy
gt r s
też działają (równoważne z'r'>'s'
lubgt('r','s')
.źródło
Wbudowane
ones
izeros
są zazwyczaj stratą miejsca. Możesz osiągnąć ten sam wynik, po prostu mnożąc tablicę / macierz (o pożądanym rozmiarze) przez 0 (aby uzyskać wynikzeros
) i dodaj 1, jeśli chcesz wynikones
.Działa to również, jeśli chcesz utworzyć wektor kolumny lub wiersza zera lub jedynek o rozmiarze jednego wymiaru macierzy.
Jeśli chcesz utworzyć macierz o określonym rozmiarze, którego możesz użyć,
zeros
ale możesz również przypisać ostatni element do 0, a MATLAB wypełni resztę.źródło
~(1:n)
do wektorów 1-d zero.Jądra konwolucji 2D
To może temat niszowy, ale najwyraźniej niektórzy ludzie lubią używać splotu do różnych rzeczy tutaj. [wymagany cytat]
W 2D często potrzebne są następujące jądra:
Można to osiągnąć za pomocą
który jest krótszy niż
Innym często używanym jądrem jest
które można skrócić za pomocą
źródło
toeplitz([0 1 0])
Dość często używam
meshgrid
lubndgrid
, powiedzmy, że chcemy obliczyć obraz mandelbrota, a następnie inicjujemy npTeraz dla zestawu mandelbrota potrzebujemy kolejnej macierzy
c
wielkościx
iy
zainicjowanej zerami. Można to łatwo zrobić, pisząc:Możesz także zainicjować go do innej wartości:
Ale możesz faktycznie zaoszczędzić niektóre bajty, po prostu dodając inny wymiar w
meshgrid/ndgrid
:Możesz to zrobić tak często, jak chcesz:
źródło
x=-2:1d-2:1;y=x'
.Podsumowanie sekwencji funkcji
Do sumowania funkcji f (x_n), gdzie n jest wektorem kolejnych liczb całkowitych, zaleca się feval zamiast symsum.
Zauważ, że operacja elementarna
.*
i./
jest konieczne zamiast operacji binarnych parami*
i/
Jeśli funkcja może być naiwnie napisana, nikt z obu ostatnich sposobów nie jest odpowiedni.
na przykład jeśli funkcja jest
log
, możesz po prostu zrobić:,sum(log(1:n))
który reprezentuje:dla stosunkowo zaawansowanych funkcji, takich jak
log(n)/x^n
jakie możesz zrobić:a nawet krótszy w niektórych przypadkach, gdy funkcja jest dłuższa jako
f(x)=e^x+sin(x)*log(x)/x
...jest to znacznie krótszy niż
sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
Uwaga: tę sztuczkę można zastosować w przypadku innych operatorów włącznie, takich jak
prod
lubmean
źródło