답변:
a
하여 0 값이 없습니다 .nnz(a)
numel(a)
a(a==0)
하십시오 a(find(a==0))
.~t
보다 짧은 t==0
, 심지어는 ~~t
보다 짧은 t!=0
.0*(1:n)
보다 짧다 zeros(1,n)
||
그리고 &&
첫 번째 인수는 스칼라 때, 많은 다른 사업자와는 달리, 그 결과를 scalarize. 행렬의 경우 요소가 0이 아닌 비어 있지 않은 행렬 만 논리 값이 true 입니다.따라서 모든 행렬 0||m
대신에 할 수 있습니다 all(all(m))
.
함께 노력 0||[1 1;1 0]
하고 0||[1 1;1 1]
설득하십시오.
내장을 여러 번 사용하는 경우, 예를 들어 문자를 절약하기 위해 함수 핸들을 수행하십시오. f=@find
. 짧은 함수 이름의 경우 적어도 3 개의 어커런스가 긴 어커런스의 경우 2 개 어커런스로도이를 정당화합니다.
함수가 단일 명령문 인 경우 하나의 f=@(n)dosomething(n)
표기법을 선호하십시오 function r=f(n)r=dosomething(n);end
.
불행히도 전역 변수는 전역 범위와 변수를 사용하는 각 함수 모두에서 선언해야합니다. 그러나 익명 @(n)...
함수는 호출 된 범위의 모든 변수를 "참조"합니다.
그것은 할 가능성이 f(a=0,b=0)
대신 a=0;b=0;f(a,b)
.
이것은 문서화되지 않은 기능으로 보이지만 평가 순서는 왼쪽에서 오른쪽으로 (3.8.1에서 확인 됨) zeros(a=n,b=a*a)
anxn ^ 2 행렬을 만들고 행과 열 번호 a
와 b
변수 를 모두 저장할 수 있습니다.
운영자 우선 순위 테이블은 친구입니다. b=(a==0)
이후 b=a==0
동일 하지 않습니다 .
나는 누군가가 사용하는 것을 보았을 때 (우리에게 말해주십시오 =) 기억하지 않지만, 이것은 깔끔한 트릭을 발견했습니다.
일반적으로 행렬을 추가하는 경우 크기는 같아야하지만 1 차원 (1xn 및 nx1) 행렬의 경우 바로 가기가 있습니다 (Matlab에서는 작동하지 않음).
z = (1:5)+(6:10)';
같은 효과를냅니다
[x,y]=meshgrid(1:5,6:10);
z = x+y;
pawel.boczarski가 이미 언급 한 것 : Octave에서는 함수 핸들 내에서 보조 변수를 정의 할 수 있으며 Matlab에서는 보조 변수를 정의 할 수 있으며 변수 할당 자체에 할당 값이 있으므로 코드를 실제로 단축 할 수 있습니다 (이것은 쓸모가 없습니다) 예를 들어 트릭을 얻을 수 있습니다) :
f=@(n)(z=n+1)*z; %returns (n+1)^2
그런 다음 또 다른 트릭 (Matlab에도 적용 가능)은 (하드 코딩 된) 숫자를 저장하기 위해 문자열을 남용하는 것입니다 (이 깔끔한 트릭은 feersum에서 도난당했습니다) . 문자열을 숫자로 해석하는 것이 필요합니다 .0을 추가하는 것만 큼 쉽습니다.
a = 'abc';
a+0 %returns
[97 98 99]
또는
sum('abc') == 294
a+0
아니라고 생각합니다 a+'0'
. 그 이외의 팁은 훌륭합니다 =)
+= -= /=
아래 목록에 etc 연산자 를 추가 할 수 있습니까?
+a
보다 짧은a+0
Octave는 기본 인수를 얻을 수 있으므로 인수 목록에서 표현식을 평가할 수 있습니다.
이 기능은 표현식을 계산하고 여러 번 사용할 때 유용합니다.
f = @(x,a=sort(x))a(a>.5);
사용 사례는 인덱스 할당을 사용하여 배열의 일부를 수정하고 배열을 사용하려는 경우입니다.
a=[1 2 3 4]
a(2)=5;
그러나 표현식 (a(2)=5)
은을 반환 a(2)
하거나 표현식 (a([1 3])=4)
은 두 요소 배열을 반환합니다. 전체 배열을 반환하지도 않습니다. 인수 목록을 사용할 수 있습니다 :
f=@(a=[1 2 3 4],b=a(2)=5)a;
여기에서 인덱스 할당의 결과는 더미 변수에 저장되고 b
함수는 배열을 반환합니다.
옥타브에서는 MATLAB에서 금지 된 기능인 임시 표현식에 인덱싱을 적용 할 수 있으며이 기능은 골프에 매우 유용합니다. 예:
Octave : [1 23 4 5 7](3:4)
및 해당 MATLAB 해당 : a=[1 23 4 5 7];a(3:4)
Octave : hilb(4)(4:5,4:5)
및 해당 MATLAB 해당 : h=hilb(4);h(4:5,4:5)
Octave : {1,4,{4 5 6},[7 ;3]}{3}
및 해당 MATLAB 해당 : a={1,4,{4 5 6},[7 ;3]};a{3}
Octave : num2cell([1 2 3 4]){:}
쉼표로 구분 된 목록 작성
Octave :a'(:)'
-익명 함수에서 정규 함수로서 할당을 포함하여 여러 표현식을 평가 해야하는 경우가 있습니다. 하나의 접근법은 셀에 각 표현식을 배치 할 수 있다는 것입니다 (셀은 여러 유형의 객체를 포함 할 수 있으므로). 각 표현식에서 인덱싱을 사용하여 해당 요소를 추출 할 수 있습니다.
{1,4,{4 5 6},[7 ;3]}{3}
또는
{a=1,b=4,c={4 5 6},[b ;3]}{4}
세미콜론을 건너 뛰십시오!
이 답변 을 사용 하여 요점을 설명 하겠습니다 .
원래 코드는 다음과 같습니다.
function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end
세미콜론을 제거한 후 3 바이트를 절약하여 다음과 같이 줄일 수 있습니다.
function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end
이것은 꽤 많은 곳에서 사용될 수 있으며 구문 오류가 자주 작동하는 것처럼 보이기 때문에 시도조차하지 않는 것들입니다.
사용 eval
!
Luis Mendo의 답변 에서 영감을 얻었 습니다 .
익명 함수는 대부분의 경우 하나 이상의 호출이 필요한 스크립트를 만드는 것보다 짧습니다 input('')
. 단점은 루프 (예를 들면, 매트릭스의 두 요소를 교환 등) 가변 변형 있다는 불가능 성가신.
을 사용하면 eval
일반 익명 함수를 사용하여 입력을 가져오고 일반 스크립트를 사용하여 스크립트를 실행할 수 있습니다.
c=(i=@input)('');N=i('');A=i('');for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A
이것과 비교하여 :
@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')
코드는 동일하지만 입력 섹션이 훨씬 짧습니다.
이것은 또한 다음과 같이 입력 변수를 수정하는 데 사용될 수 있습니다 (이를 위해 Luis Mendo의 신용 !) :
f(x)eval('x([1,4])=x([4,1])`;
MATLAB에 대한 관련 팁은 동일하지 않습니다 .
옥타브의 거의 알려지지 않은 기능은 대부분의 내장 함수를 괄호없이 호출 할 수 있다는 것입니다.이 경우 뒤에 오는 모든 것을 문자열로 처리합니다 (공백이없는 한). 공백이 있으면 따옴표가 필요합니다. 이것은 자주 사용할 때 1 ~ 2 바이트를 절약하기 위해 사용될 수 있습니다 disp
. 다음 작업이 모두 동일하며 결과는 동일합니다.
disp('Hello')
disp Hello
disp"Hello"
공백이 있으면 따옴표가 있어야 합니다.
disp('Hello, World!')
disp"Hello, World!"
덜 유용한 다른 예는 다음과 같습니다.
nnz PPCG
ans = 4
size PPCG
ans = 1 4
str2num 12
ans = 12