MATLAB에서 골프를 할 때 어떤 일반적인 팁이 있습니까? MATLAB에 다소 특정한 코드 골프 문제에 일반적으로 적용될 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.
MATLAB에서 골프를 할 때 어떤 일반적인 팁이 있습니까? MATLAB에 다소 특정한 코드 골프 문제에 일반적으로 적용될 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.
답변:
속성 이름 단축
MATLAB에서는 속성을 식별하는 문자열이 모호성을 유발하지 않는 한 단축 될 수 있습니다.
plot(X,'C','k') % Ambiguous property found.
plot(X,'Co','k') % Expands to Color (black)
이것은 실제로 나에게 도전을 이겼다 :)
name, value
위와 같이 쌍 의 이름에 적용된다는 점을 강조하고 싶습니다 . (그렇지 않은 것들 sort(rand(4,1),'descend')
)
conv(1:5,[1 1],'s')
대신 다음 과 같은 것들에도 적용됩니다.conv(1:5,[1 1],'same')
문자열은 문자 행 벡터 일뿐입니다. 이것은 대신에
for i=numel(str)
a=str(i)
...
end
당신은 단순히 쓸 수 있습니다
for(a=str)
...
end
처음 이것을 사용했을 때 : /codegolf//a/58387/32352
양의 정수 감안할 때 n
, 표준 방법은 생성 n
번째 화합의 뿌리 입니다
exp(2j*pi*(0:n-1)/n)
이것은 뿌리 1
가 양의 각도 방향으로 시작 하고 움직입니다. 주문이 중요하지 않은 경우 주문을 단축 할 수 있습니다.
exp(2j*pi*(1:n)/n)
exp(2j*pi/4)
허수 부 ( j
) 와 같으 므로 다음과 같이보다 간결하게 작성할 수 있습니다 ( @flawr로 인해 속임수 ).
j.^(4*(0:n-1)/n)
또는
j.^(4*(1:n)/n)
그러나 이산 푸리에 변환 은 더 짧은 방법을 제공합니다 (두 개의 불필요한 괄호를 제거하는 @flawr 덕분에).
fft(1:n==n)
그것은 뿌리 1
가 양의 각도 방향으로 시작 하고 움직입니다. 또는
fft(1:n==2)
1
음의 각도 방향에서 시작 하여 음의 각도 방향으로 이동합니다.
fft(1:n==2)
Octave에 대한 관련 팁은 동일하지 않습니다 .
MATLAB과 Octave의 거의 알려지지 않은 기능은 대부분의 내장 함수를 괄호없이 호출 할 수 있다는 것입니다.이 경우 공백을 포함하지 않는 한 그 뒤에 나오는 모든 것을 문자열로 처리합니다. 공백이 있으면 따옴표가 필요합니다. 다음을 사용할 때 바이트를 저장하는 데 자주 사용할 수 있습니다 disp
.
disp('Hello, World!')
disp 'Hello, World!'
덜 유용한 다른 예는 다음과 같습니다.
nnz PPCG
ans = 4
size PPCG
ans = 1 4
str2num 12
ans = 12
"실제 계산할 수 있습니까?" -도전:
strchr sssssssssssssst t
는에 해당하고 strchr('sssssssssssssst','t')
를 반환합니다 15
.
nnz nnnnnnnnnnnnnn
는에 해당하고 nnz('nnnnnnnnnnnnnn')
를 반환합니다 14
.
같은 물건 gt r s
에 해당 너무 작업 ( 'r'>'s'
또는 gt('r','s')
.
내장형 ones
이며 zeros
일반적으로 공간 낭비입니다. (원하는 크기의) 배열 / 행렬에 0을 곱하여 (의 결과를 얻음) 동일한 결과를 얻을 수 있고의 출력 zeros
을 원하면 1을 더하십시오 ones
.
d = rand(5,2);
%// Using zeros
z = zeros(size(d));
%// Not using zeros
z = d*0;
%// Using ones
o = ones(size(d));
%// Not using ones
o = 1+d*0
이것은 0 또는 행렬의 한 차원 크기의 열 또는 행 벡터를 만들려는 경우에도 작동합니다.
p = rand(5,2);
z = zeros(size(p,1), 1);
z = 0*p(:,1);
o = ones(size(p, 1), 1);
o = 1+0*p(:,1);
특정 크기의 행렬을 만들려면 사용할 수 zeros
있지만 마지막 요소를 0에 할당하고 나머지는 MATLAB으로 채울 수 있습니다.
%// This
z = zeros(2,3);
%// vs. This
z(2,3) = 0;
~(1:n)
1-d 제로 벡터 에 사용 하고 싶습니다 .
이것은 틈새 주제 일 수 있지만 분명히 일부 사람들은 여기에서 다양한 것들에 대해 회선을 사용하는 것을 좋아합니다. [인용 필요]
2D에서는 다음과 같은 커널이 종종 필요합니다.
0 1 0
1 1 1
0 1 0
이것은 다음을 사용하여 달성 할 수 있습니다
v=[1,2,1];v'*v>1 %logical
v=[1,0,1];1-v'*v %as numbers
보다 짧은
[0,1,0;1,1,1;0,1,0]
자주 사용되는 또 다른 커널은
0 1 0
1 0 1
0 1 0
사용하여 단축 할 수 있습니다
v=[1,-1,1];v'*v<0 % logical
[0,1,0;1,0,1;0,1,0] % naive verison
toeplitz([0 1 0])
나는 종종 나 자신을 찾 meshgrid
거나 ndgrid
mandelbrot 이미지를 계산하고 싶다고 가정 해 봅시다.
[x,y]=meshgrid(-2:1e-2:1,-1:1e-2,1)
이제 만델 브로 집합에 대해 우리는 또 다른 매트릭스 필요 c
의 크기 x
및 y
하지만 제로로 초기화. 다음과 같이 작성하면 쉽게 수행 할 수 있습니다.
c=x*0;
다른 값으로 초기화 할 수도 있습니다.
c=x*0+3;
그러나 실제로 다른 차원을 추가하여 바이트를 절약 할 수 있습니다 meshgrid/ndgrid
.
[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 0); %or for the value 3
[x,y,c]=meshgrid(-2:1e-2:1,-1:1e_2,1, 3);
그리고 당신은 당신이 원하는만큼 자주 할 수 있습니다 :
[x,y,c1,c2,c3,c4,c5]=meshgrid(-2:1e-2:1,-1:1e_2,1, 1,pi,exp(3),1e5,-3i)
x=-2:1d-2:1;y=x'
.
함수 f (x_n)을 합산하기 위해, 여기서 n은 연속 정수로 구성된 벡터입니다. symval 대신 feval을 사용하는 것이 좋습니다.
Syms x;symsum(f(x),x,1,n);
Sum(feval(@(x)f(x),1:n));
공지 사항 초등학교 작동 그 .*
와 ./
대신 페어 바이너리 운영의 필요 *
와/
함수가 순진하게 작성 될 수 있다면 마지막 방법 중 어느 것도 적합하지 않습니다.
예를 들어 함수가 log
있으면 간단하게 다음을 수행 할 수 있습니다 sum(log(1:n))
.
Sum(f(1:n));
log(n)/x^n
당신이 할 수있는 비교적 정교한 기능을 위해 :
Sum(log(1:n)./5.^(1:n))
함수가 f(x)=e^x+sin(x)*log(x)/x
.... 보다 길면 더 짧습니다 .
Sum(feval(@(y)e.^(y)+sin(y).*log(y)./y,1:n))
그보다 훨씬 짧은 sum(feval(@(y)e.^(1:n)+sin(1:n).*log(1:n)./(1:n),1:n))
참고 : 이 트릭은 다른 포괄적 연산자에 prod
또는mean