Matlab에서 변수로 i 및 j 사용


142

i그리고 j매우 인기있는 변수 이름입니다 (예 : 이 질문this 참조 ).

예를 들어, 루프에서 :

for i=1:10,
    % do something...
end

매트릭스의 인덱스로 :

mat( i, j ) = 4;

왜 Matlab에서 변수 이름으로 사용 해서는 안 됩니까?


5
물론 나는 그것을 그렇게 표시하지는 않지만 대답에서 판단하면 이것이 "주로 의견 기반"이라고 말할 것입니다. ;-) 나는 개인적으로 포기하지 않을 i, j, k일반 루프 변수 이름으로.
A. Donda

1
@ A.Donda 글쎄, 이것은 당신의 의견입니다;)
Shai

@Shai, 이것이이 질문의 마지막 문장입니다. "왜 Matlab에서 변수 이름으로 사용해서는 안됩니까?" 당신이 왜 당신의 질문에 대한 내 판을 거부하는지는 확실하지 않습니다! 제목을보다 건설적인 제목으로 변경했습니다. "
Malab

답변:


176

때문에 ij나타내는 두 기능입니다 허수 단위를 :

라는 변수 그래서 i하거나 j그들을 무시합니다, 잠재적으로 자동으로 차단 코드 복잡한 수학 않습니다.

가능한 해결책은 대신 iijj변수로 루프 변수를 사용하거나 가상 단위를 나타내는 데 필요할 1i때마다 사용 i하는 것을 포함합니다.


42
당신이 무엇을 파괴하지 않는 경우에도 실행 시간은 여전히 해결하기 위해 희생하는 것도 참고 가치가 ij변수 이름을.
Eitan T

14
@Eitan : Matlab의 JIT 컴파일 버전에서 구체적으로 확실한 방법으로 백업 할 수 있습니까? 나는 그것이 사실이라고 결코 본 적이 없다 (그리고 for10 억 회 루프를 호출하는 간단한 테스트 는 타이밍의 통계적 차이를 보여주지 않는다). 모두를 위해 우리가 특별한 코드가 핸들이 알고 정확히 이것 이외의 다른 변수를 사용하여 ij(와 k?) 약간 느린 사실이다. 그리고 존재하는 차이점은 실생활에는 존재하지 않는 것입니다. 단순히 사용하지 않을 이유가 없습니다 ij일반 변수는 다른 모든 매트랩 기능처럼 적절하게 사용되어야한다 - 그들은으로는.
horchler 2016 년

5
@horchler 음, 공식 문서는 명시 여기에 표준 MATLAB 데이터 클래스를 오버라이드 (override) "성능에 부정적인 영향을 미칠 수있다"고하고, 여기 견고성뿐만 아니라, 속도의 이유로 복잡한 상수를 무시 방지하기 위해 암시한다. 이전 R2009b 문서 에서는 JIT 가속을 방해 할 수 있으므로 복잡한 상수를 재정의하지 않는 것이 좋습니다. 변수 이름 확인은 어려울 수 있지만 수백만 번 반복하면 중요 할 수 있습니다.
Eitan T

14
Matlab의 고대 버전에서 아마도. 나는 그것을 직접 보곤했다. 그러나 적어도 R2012a + (OS X)는 더 이상 없습니다. 그리고 for루프를 10 억 번 호출 하고 모든 방식의 타이밍 체계를 시도 할 때 아무런 차이가 없었 습니다. 나는 새로운 SO 사용자에게 루프를 사용 i하고 j반복 하기 때문에 완벽하게 유효한 코드가 잘못되었다는 말을 듣고 있습니다. 솔직히 그냥 바보 사람들은이 질문의 중요한 점을 누락 : 그 ij하나가 읽을 수있는 현대 MATLAB 코드를 작성하고자하는 경우에도 허수 단위에 사용되어서는 안된다.
horchler

12
나의 주요 시간 절약은 ii. 내가
찾는

62

그것은 방지 할 수있는 좋은 방법입니다 ij그 변수 또는 허수 단위 것에 대해 혼란을 방지하기 위해 변수를.

개인적으로, 그러나, 내가 사용 i하고 j짧은 루프의 변수로 꽤 자주 인덱스를. 내 자신의 코드에 문제가 발생하지 않도록하려면 나는에 대한 또 다른 좋은 연습 수행 ij: 하지 않는 가상의 번호를 표시하기 위해 그들을 사용합니다. 실제로 Matlab의 자체 문서는 다음과 같습니다.

속도와 향상된 견고성를 들어, 복잡한 대체 할 수있는 ij에 의해 1i.

따라서 잠재적 충돌로 인해 일반적으로 사용되는 두 가지 변수 이름을 피하는 대신 허수에 대해 명시 적입니다. 또한 내 코드를 더 명확하게 만듭니다. 내가 볼 1i때 마다 sqrt(-1)변수가 될 수 없기 때문에 그것이 나타내는 것을 알고 있습니다.


2
실제로 사용하는 것이 좋습니다 1i. 그러나의 의미를 변화 ij같은 어려운 디버그 오류가 발생할 수 있습니다 이것 .
Shai

1
@Shai 좋은 지적. 나는 피하는 것을 인정하는 내 대답을 쥐게 i하고 j최선을 다하지만, 내 개인적인 코딩 스타일이 그 규칙을 따르지 않는 방법을 설명했다.
shoelzer

2
언급 된 속도는 그다지 중요하지 않습니다 : stackoverflow.com/questions/18163454/…
Dennis Jaheruddin

전적으로 동의합니다! 모범 사례는 복잡한 수학이 1i아닌 항상 사용하는 것 i입니다. 의이 같은 허수를 생각하자 1i및 걸릴 i허수로 나쁜 연습. 다른 방법은 아닙니다. 사용 i, ii, iii매트랩 일반적입니다 사람들이 충실 문제가없는 1i1j복잡한 번호는. 또한 Matlab은 이것을 존중하며 이전 답변에서 언급 한대로 성능을 저하시키지 않습니다.
SdidS

i와 j는 어쨌든 사용해서는 안됩니다-그 숫자는 무언가 를 의미 합니다 -목적 (row_n, elementNo, listItemIndex 등)을 설명하는 이름을 사용하십시오. 그래서 훨씬 더 쉽게 누군가가 무엇을하고 있는지, 디버깅 등을 이해하기 위해 소요 된 여분의 시간이 더 가치가 더 던져 - 멀리 스크립트보다 더 아무것도 장기 유지 보수의 이득보다 - 심지어 matlab에 편집기가 아니라 배후에 대부분의 다른 최신 IDE.
LightCC 2012 년

27

MATLAB의 이전 버전에서의 사용을 피하기 위해 좋은 이유가있을 사용 i하고 j변수 이름과 같은를 - 다양한 MATLAB JIT의 초기 버전 그러므로 것입니다 당신이 변수로 또는 가상 장치로 사용하고 있던 여부를 알 수있는 영리 충분하지 있었고, 가능한 많은 최적화를 끄십시오.

따라서 코드는 변수의 존재 ij변수로 인해 속도 가 느려지고 다른 것으로 변경하면 속도가 빨라집니다. 당신이 많은 매스 웍스의 코드를 읽는다면, 당신은 볼 이유의 그 iijj루프 인덱스로 매우 널리 사용. 한동안 MathWorks는 비공식적으로 사람들에게 스스로 그렇게하도록 조언했을 수도 있습니다 (비록 그들은 공식적으로 사람들에게 항상 현재 JIT가하는 것보다는 우아함 / 유지 보수를 위해 프로그램하도록 권고합니다).

그러나 그것은 오래 전에 이루어졌으며, 오늘날 많은 사람들이 생각하는 것보다 훨씬 덜 중요하지만 죽기를 거부하는 "좀비"문제입니다.

최근 버전에서는, 정말 여부 사용에 대한 개인적인 취향입니다 ij변수 이름이나하지. 복잡한 숫자와 많은 작업을 할 경우, 당신은 회피 할 수 있습니다 i그리고 j당신은 또한 / 대신에서만 사용할 수 있지만 변수로, (혼란의 작은 위험을 피하기 위해 1i또는 1j더 적은 혼란, 그리고 약간의 성능 향상을 위해 ).

반면에, 일반적인 작업에서는 복잡한 숫자를 다루지 않으며 자유롭게 사용 i하고 j루프 인덱스 로 사용하면 코드를 더 읽기 쉽습니다.


나는 추천하지 않는다는 것을 말하는 많은 대답을 보았습니다 ... 누가 그 권고를하고 있는지 말하지 않고. 다음은 현재 릴리스 문서에서 MathWorks의 실제 권장 사항 범위입니다 i.

i는 함수이므로 재정 의하여 변수로 사용할 수 있습니다. 그러나 복잡한 산술에서 변수 이름을 사용하려는 경우 변수 이름에 i 및 j를 사용하지 않는 것이 가장 좋습니다. [...] 속도와 향상된 견고성을 위해 복잡한 i와 j를 1i로 대체 할 수 있습니다.


15

다른 답변에서 설명한 것처럼 i일반적인 코드 사용은 두 가지 이유로 권장되지 않습니다.

  • 허수를 사용하려면 지수와 혼동되거나 덮어 쓸 수 있습니다
  • 색인으로 사용하면 허수와 혼동되거나 혼동 될 수 있습니다

으로 제안 : 1iii권장합니다. 그러나이 두 가지가 모두 미세한 편차이지만 i두 가지 대안을 함께 사용하는 것은 좋지 않습니다.

(개인적으로) 내가 싫어하는 이유는 다음과 같습니다.

val2 = val + i  % 1
val2 = val + ii % 2
val2 = val + 1i % 3

하나는 둘 또는 셋에 대해 쉽게 읽히지 않을 것이지만 둘과 셋은 서로 닮았습니다.

따라서 개인적 권장 사항은 다음과 같습니다. 복잡한 코드로 작업하는 경우 항상 1i다른 루프 변수와 함께 사용 하십시오.

당신이 많은 루프 변수와 문자로 충분를 사용하지 않는 경우에 대한 것을 하나의 편지 지표의 예 : t, u, kp

더 이상 인덱스의 예 : i_loop, step, walk, 및t_now

물론 이것은 개인적인 취향의 문제이지만 너무 오래 자라지 않고 명확한 의미를 갖는 지표를 찾기가 어렵지 않아야합니다.


1
1i는 허수를 나타냅니다 (또한 Matlab 변수 이름은 숫자로 시작할 수 없습니다)
lib

2
@DennisJaheruddin : 뻔뻔한 플러그 : Stack Overflow에 대한 사용자 스크립트 를 강조하는 MATLAB 구문을 사용하십시오 . 마지막 예에서는 1i숫자로 다르게 색상이 표시됩니다.)
Amro

2
직선에서 doc idoc j"속도와 향상된 견고성를 들어, 1I하여 복잡한 i와 j를 교체 할 수 있습니다." IMO, 현재 matlab에 사용하지 이유가 없다 ij등 루프에서, 또는 이외의 사용 아무것도 1i(가상 장치를 나타 내기 위해 1j작동도). 항상 약간 호환되지 않는 Symbolic 엔진에 문자열을 전달하는 경우는 예외입니다. 이상한 그 help 1idoc 1i하지만 일을하지 않습니다.
horchler 2016 년

11

그것은 1i받아 들일 수 있고 모호한 작성 방법 sqrt(-1)이며, 따라서 사용을 피할 필요가 없다고 지적되었다 i. 데니스 (지적 그럼 다시, https://stackoverflow.com/a/14893729/1967396 ), 그것의 차이 볼 어려울 수 있습니다 1iii. 내 제안 : 1j가능한 경우 가상 상수로 사용하십시오. 그들이 사용하는 - 그것은 전기 엔지니어가 사용하는 것과 같은 트릭 j을위한 sqrt(-1)때문에 i이미 소요되어 현재 .

필자는 개인적으로 사용하지 않습니다 ij; 내가 사용 ii하고 jj속기 색인 변수 (및 KK, LL, mm, ...)과 같은 1j때 복잡한 번호를 사용해야합니다.


2
"차이 볼 어려울 수 있습니다 1iii사이 그리고 더의 차이" 1l사이 O0. 이것이 MATALB을 새로 설치하는 첫 번째 단계가 기본 글꼴 크기를 변경하는 이유입니다.
glglgl

6

가상의 단위와의 혼동은 여기에서 잘 다루어졌지만 이것들과 다른 단일 문자 변수 이름이 때때로 권장되지 않는 다른 더 많은 이유가 있습니다.

  1. MATLAB 특히 : MATLAB 코드에서 C ++ 소스를 생성하기 위해 코더를 사용하는 경우 (끔찍하지는 않지만) 잠재적 인 타이핑 충돌로 인해 변수를 재사용하지 않도록 명시 적으로 경고합니다.

  2. 일반적으로 IDE에 따라 단일 문자 변수 이름이 형광펜 및 검색 / 바꾸기를 방해 할 수 있습니다. MATLAB 은이 문제를 겪지 않으며 Visual Studio는 한동안 문제가 없었지만 MISRA와 같은 C / C ++ 코딩 표준은 다시 조언하는 경향이 있습니다.

필자는 수학 소스를 직접 구현하는 명백한 이점에도 불구하고 모든 단일 문자 변수를 피합니다. 처음 몇 백 번은 약간의 추가 노력이 필요하지만 그 후에는 눈치 채기를 그만두고, 자신이나 다른 가난한 영혼이 코드를 읽을 때 얻는 이점은 군단입니다.


4

사소한 코드에는 여러 for루프 가 포함되어 있으므로 모범 사례에서는 목적과 범위를 나타내는 설명이 포함 된 이름을 사용하는 것이 좋습니다. 에 대한 시간 먼 옛날 (내가 저장하지 않을거야 자사의 5 ~ 10 개 라인 스크립트 제외), 난 항상 같은 변수 이름을 사용하고 idxTask, idxAnotherTaskidxSubTask

아니면 적어도 그것이 예를 들어 인덱싱 된 배열의 첫 글자 배에 ss인덱스를 subjectList, tt색인 taskList,하지만 iijj있는 나를 쉽게 그들이 루프 내 여러 밖으로 인덱싱 된 배열을 식별하는 데 도움이되지 않습니다.


3

기본적 ij허수 단위 스탠드. MATLAB의 관점 i에서 변수로 사용 하는 것은 어떻게 든 변수로 사용하는 1것과 같습니다 .


5
나는 그것이 그렇게 생각하지 않습니다. i는 합법적 인 변수 이름이므로 실제로 변수 이름으로 i와 j를 사용할 수 있습니다. 이전 답변에서 언급했듯이 상상의 의미를 숨길 것입니다. 1은 합법적 인 변수 이름이 아닙니다. 복소수를 사용하지 않으면 괜찮습니다.
thang

@thang 그래서 내가 "좋아요"가 아니라 "어떻게"이라고 말했다. 차이가 있다는 것을 알고 있습니다. OP는 왜 사용해서는 안되는지 물었고, 이미 숫자를 표현했기 때문에 설명하려고했습니다.
yo '

2
알았어, 미안, 어떻게 든 무슨 뜻 인지 모르겠어 나에게 그것은 분명히 다릅니다. 왜냐하면 원하는 경우에도 1을 변수로 사용할 수 없기 때문에 어디에서 왔는지 알 수 있습니다.
thang

당신은 할 수 있습니다 당신은 또한 (그 내장의 기능을 더 사용 / 상수를 손상과 같은 시간에) 변수에 대한 기존의 함수 이름을 사용할 수 있습니다로,이를 사용합니다. 당신이 정말로 그것을 원하든 또 다른 것입니다 (imo simple answer : no)
Gunther Struyf

1
죄송하지만이 설명은 의미가 없습니다. ij실제로 허수 부 값을 반환하는 함수이다. 범위의 함수와 이름이 같은 변수를 사용할 수 있습니다. 그러나 이것은 기능을 어둡게합니다.
patrik

2

당신이 매우 혼란스러운 사용자가 아니라면 변수 이름 ij 를 사용할 때 위험이 거의 없다고 생각 하고 정기적으로 사용합니다. 이 관행을 피해야한다는 공식적인 징후는 보지 못했습니다.

상상의 단위를 그림자로 표시하면 다른 게시물에서 언급 한 것처럼 일부 상황에서 혼란을 초래할 수는 있지만 전반적으로 주요 문제로 보지 않습니다. MATLAB에서 할 수있는 훨씬 더 혼란스러운 일이 있습니다.false=true

내 의견으로는 아마도 피해야 할 유일한 시간은 코드가 가상의 숫자를 다루는 경우뿐입니다.


다운 투표 할 때 의견을 말 해주세요. 예를 들어 연습이 권장되지 않음을 나타내는 Mathworks 링크가 있습니다 (공식 지침을 참조하지 않고 여러 포스터에서 명시 함). 실제로 루프에서 'i'를 사용하는 것은 Mathworks의 공식 예제에서 사용되고 있습니다. 내 경험상 그것은 코드를 명확하고 간결하게 만들고 매우 일반적인 관행입니다.
gregswiss

1
인용 문서 "때문에 i함수가, 그것은 오버라이드 (override) 및 변수로 사용할 수 있습니다. 그러나 사용하지 않는 것이 좋습니다 ij복잡한 연산에서 사용하려는 경우 변수 이름을." 올리버의 대답에 대한 Eitan T의 의견과 함께 (그가 시간을 정한 것 같습니다) 충분한 증거로 보입니다.
Adriaan

1
또한 @Adriaan이 언급 한 의견에 대해 2013 년부터 이미 답변을 받았습니다.
Andras Deak

1
따라서 복잡한 산술에 사용하려는 경우 문서에 설명되어 있으며 그렇지 않은 경우에는 적용되지 않습니다. 모든 사람이 여기에 대해 까다로운 이유를 모릅니다! 방금 다른 관점을 제시하고있었습니다.
gregswiss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.