MATLAB에서의 골프 팁


14

MATLAB에서 골프를 할 때 어떤 일반적인 팁이 있습니까? MATLAB에 다소 특정한 코드 골프 문제에 일반적으로 적용될 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.


3
관련이 있지만 중복되지는 않음 : Octave에서의 골프 팁
Dennis Jaheruddin

답변:


10

골프를 시작하기 전에 알아야 할 사항 :

MATLAB 계산에서 문자는 ASCII 코드와 동일하게 동작합니다.

'abc' - 'a'  % Returns: [0 1 2]
'123' - '0'  % Returns: [1 2 3]
'“' == 8220  % Returns: 1 (logical)
'a':'e'==100 % Returns: [0 0 0 1 0] (logical)

9

속성 이름 단축

MATLAB에서는 속성을 식별하는 문자열이 모호성을 유발하지 않는 한 단축 될 수 있습니다.

plot(X,'C','k') % Ambiguous property found.
plot(X,'Co','k') % Expands to Color  (black)

이것은 실제로 나에게 도전을 이겼다 :)


2
대답은 정확하지만 name, value위와 같이 쌍 의 이름에 적용된다는 점을 강조하고 싶습니다 . (그렇지 않은 것들 sort(rand(4,1),'descend'))
Dennis Jaheruddin

1
conv(1:5,[1 1],'s')대신 다음 과 같은 것들에도 적용됩니다.conv(1:5,[1 1],'same')
Luis Mendo

6

문자로 캐스트는 문자와 연결하여 수행 할 수 있습니다.

x='a'+magic(5) % Array with character codes of several letters

char(x) % The standard way
['' x] % The compact way

하나의 문자 만 저장하지만 이것은 자주 사용됩니다.


5

문자열은 문자 행 벡터 일뿐입니다. 이것은 대신에

for i=numel(str)
    a=str(i)
    ...
end

당신은 단순히 쓸 수 있습니다

for(a=str)
    ...
end

처음 이것을 사용했을 때 : /codegolf//a/58387/32352


4

이산 푸리에 변환을 통한 통일의 뿌리

양의 정수 감안할 때 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)
flawr

@flawr 나는 우선 순위 규칙을 모른다 ... 고마워!
Luis Mendo

3

nnz 때로는 몇 바이트를 절약 할 수 있습니다.

  • 논리 행렬의 합을 원한다고 상상해보십시오 A. sum(sum(A))또는 대신 에을 sum(A(:))사용할 수 있습니다 nnz(a)( nnz암시 적으로 적용 (:)).
  • 배열의 요소 수를 알고 싶을 때 대신 0이 없는지 numel(x)확인할 수 있습니다 nnz(x). 예를 들어 x문자열 인 경우에 적용됩니다 .

3

행렬의 벡터에 대한 반복.

행렬로 벡터 집합이 주어지면 실제로 단일 for 루프를 통해 벡터를 반복 할 수 있습니다.

for v=M
    disp(v);
end

"전통적으로"당신은 아마 그것을했을 것입니다

for k=1:n
    disp(M(:,k));
end

나는 이 도전 에서 @Suever로부터이 트릭에 대해서만 배웠다 .


3

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').


2

내장형 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;

2
~(1:n)1-d 제로 벡터 에 사용 하고 싶습니다 .
sintax

2

2D 컨볼 루션 커널

이것은 틈새 주제 일 수 있지만 분명히 일부 사람들은 여기에서 다양한 것들에 대해 회선을 사용하는 것을 좋아합니다. [인용 필요]

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])
Luis Mendo

2

나는 종종 나 자신을 찾 meshgrid거나 ndgridmandelbrot 이미지를 계산하고 싶다고 가정 해 봅시다.

[x,y]=meshgrid(-2:1e-2:1,-1:1e-2,1)

이제 만델 브로 집합에 대해 우리는 또 다른 매트릭스 필요 c의 크기 xy하지만 제로로 초기화. 다음과 같이 작성하면 쉽게 수행 할 수 있습니다.

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'.
flawr

0

일련의 기능 요약

  • 함수 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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.