2016-06-30 1 views
3

Matlab에서 새 변수가 기존 변수에 할당되면 '게으른'평가가 있음을 알고 있습니다. 예를 들면 :MATLAB 변수 전달 및 지연 지정

array2의 요소가 수정되지 않는 한 array1의 값은 array2에 복사되지 않습니다
array1 = ones(1,1e8); 
array2 = array1; 

.

여기부터는 Matlab의 모든 변수가 실제로 값 유형이고 모든 값이 전달된다고 가정합니다 (지연 평가가 사용되지만). 또한 변수가 호출 스택에서 만들어 짐을 의미합니다.

글쎄,이 방법으로 두 번째 프로그래밍 언어를 본 적이 없지만 변수를 처리하는 방식을 판단하지 않습니다. 배열과 같은 큰 데이터 구조의 경우 값 유형으로 처리하고 값을 전달하는 것이 좋은 생각이 아닌 것 같습니다. 게으른 평가는 공간과 시간을 절약하지만, 나에게는 이상하게 보입니다. 메모리 부족 오류를 유발하는 변수의 변경 (초기화 또는 할당 대신)에 대한 표현식이있을 수 있습니다. 내가 아는 한 C 배열 이름은 실제로 포인터이고, Fortran에서는 배열이 참조로 전달됩니다. 대부분의 현대 언어는 참조 유형으로 배열을 후퇴시킵니다.

그럼, 왜 Matlab이 그런 비범 한 방식으로 배열을 구현하는지 알 수 있습니다. Matlab에서는 힙에 아무것도 없거나 만들 수 없다는 것이 사실입니까?

그건 그렇고, 나는 경험 많은 Matlab 사용자들에게 그것에 대해 물었다. 그들은 일단 변수가 만들어지면 변수를 변경하지 않으며 함수 호출을 사용하여 새로운 변수를 만듭니다. 즉, 모든 변경 가능한 데이터는 변경 불가능한 것으로 취급됩니다. 이런 식으로 프로그래밍 할 때 어떤 이득이나 손실이 있습니까?

+0

저는 오랫동안 대답 할 시간이 없지만 Matlab은 항상 인자로 인수를 전달하지는 않습니다. 'x = func (x)'와 같은 것을하면, Matlab은 이것을 참조로 전달할 것이다. 'y = func (x)'와 같은 일을하면,'func()'에서'x'를 변경하지 않으면 참조로 전달 될 것입니다. 명시 적으로이 작업을 수행 할 수 없으므로 함수를 작성할 때주의해야합니다. 변수를 절대로 변경하는 것은 끔찍한 해결책처럼 보입니다. 그러면 변수는 어떻게됩니까? – Bernhard

+0

@Bernhard Just-In-Time 컴파일러가이를 인라인 함수로 처리하기 때문에 @Bernhard Matlab은'x = func (x)'와 같은 함수를 전달하므로 추가 호출 스택이 생성되지 않습니다 (이 함수가 중첩 함수가 아닌 한)). 여기서 변수를 변경한다는 것은 그 값을 변형시키는 것을 의미합니다. 물론 다른 변수에 변수를 다시 할당 할 수 있습니다. –

+0

@Bernhard MATLAB이 변수를 처리하는 방식은 프로그래머가 매우 신중하게 코드를 작성하도록합니다. 나를 위해 배열 (또는 셀)을 값 유형 변수로 만드는 것은 당황스럽고 놀라게합니다. 그 의미를 완전히 이해하지 못하면 프로그래머는 추가 계산 시간과 공간을 불필요하게 초래할 수있는시기를 결코 알 수 없습니다. –

답변

0

다른 언어에 적용 할 때 오해의 소지가있는 C 및 FORTRAN과 같은 프로그래밍 언어의 용어를 사용하면 혼란스러운 방식으로 질문을 표현할 수 있습니다. 값 의미 또는 참조 시멘틱스을 갖는 참조에 의해 값 또는 통과 되는 변수들 및 변수들 사이의 구별이

.

C에서는 변수를 값으로 전달하거나 포인터를 사용하여 참조로 전달할 수 있습니다.

MATLAB에는 포인터가 없습니다. 말한대로 MATLAB은 항상 변수를 값으로 전달합니다. 포인터가 없기 때문에 값으로 또는 참조로 변수를 전달하는지 여부를 묻는 것이 타당하지 않습니다.

그럼에도 불구 MATLAB 변수를 가질 수 있습니다 값 의미 또는 참조 시멘틱스. MATLAB에서 참조 의미가있는 변수는 핸들 변수라고합니다.

강조하기 - 변수가 값으로 전달되는 경우에도 값 또는 참조 의미를 가질 수 있습니다.

>> a = 1; 

변수 a 값의 의미를 가지고 정기적 변수를 생성

.즉, 다른 변수를 만든 다음 원본을 변경하면 새 변수가 변경되지 않습니다.

>> b = a; 
>> b 
b = 
    1 
>> a = 2; 
>> b 
b = 
    1 

하지만, 예를 들어, 그림을 만드는 경우 :

>> f = figure; 

변수 f이 참조가, 또는 의미를 처리합니다. 즉, 다른 변수를 만든 다음 원본을 변경하면 새 변수도 변경됩니다.

>> get(f, 'Name') 
ans = 
    '' 
>> g = f; 
>> set(f, 'Name', 'hello') 
>> get(g, 'Name') 
ans = 
hello 

당신은 MATLAB OO 클래스를 사용하여 자신의 변수 유형을 정의 할 때, 당신은 그 클래스의 객체가/값 또는 참조가에서 클래스를 상속 의미를 처리할지 여부를 지정할 수 있습니다 내장 클래스 handle.

값 클래스의 인스턴스 인 객체는 위의 a과 비슷하게 동작합니다. 핸들 클래스의 인스턴스 인 객체는 위의 f과 비슷하게 동작합니다. 그리고 둘 다 항상 가치있게 전달됩니다.

질문에 대한 근본적인 이유를 추측하고 있지만 핸들 클래스를 만드는 방법을 살펴 보는 것이 좋습니다. 그들은 아마도 당신이 달성하기를 바라고있는 가변적 인 행동을 제공 할 것입니다 (즉, 주위를 지나치고 메모리를 크게 늘리지 않고 사본을 가져갈 수 있으며, 항상 동일한 기본 사항을 나타냄).

"숙련 된 MATLAB 사용자"가 말한 변수 값만 사용하면 큰 손실을 보입니다. 핸들 변수를 사용하는 것이 훨씬 더 편리합니다. 그리고 저는 실제로 그것을 깨닫지 않고 그것을 사용하고있을 것입니다. 거의 모든 MATLAB Handle Graphics는 위의 f과 같은 핸들 변수에 의존합니다.


위의 내용은 MATLAB 변수의 의미에 대한 완전한 설명입니다. 이 사람들을 혼동 다른 주름의 몇 가지가 있지만, 그들은 위의 모순되지 않습니다

  1. 을 MATLAB을 가지고 있지만 패스에 의해 값 위의 설명 변수 값 또는 참조가 있는지 여부를 다른 같은 행동 (의미론), 그것은 또한 게으름 또는 copy-on-write입니다. 당신은 당신의 질문에 이것을 기술한다. 그래서 당신은 분명히 그것이하고있는 것을 얻는다. 그러나 단순히 통과 행동이나 변수 의미와는 다른 문제이다.

    오히려 y = myfun(x) 더 정상보다 x = myfun(x) 유사한 구문을 사용하여 기능을 구현하는 경우, @Bernhard에 의해 코멘트에서 언급 한 바와 같이
  2. , MATLAB, 즉 원래의 변수를 덮어 쓰기보다는 만들기 (코드에서 현재 위치에 최적화 작업을 수행 할 수 있습니다 특히 임시 복사 (myfun 내에서 수행 된 연산은 산술 연산이나 삼각 함수와 같은 제자리에서 수행 할 수 있어야하며 차원을 변경하는 '과 같은 행렬 연산이 아님). 그러나 다시 말하지만 이것은 단지 최적화 일 뿐이며 변수의 의미를 변경하지 않습니다.


PS 한가지 더 -뿐만 아니라 스택과 힙에 대한 생각을 멈출; 변수가 저장되는 메모리의 영역을 실제로 제어 할 수 없기 때문에 MATLAB에는 실제로 아날로그가 없습니다.

+0

해답을 가져 주셔서 감사합니다. C에서 포인터는 값에 의해 전달되고 가리키는 대상으로 참조 해제됩니다. "포인터를 사용하여 참조로 전달할 수 있습니다."라는 문구는 오해의 소지가 있습니다. C++에서 참조로 전달하는 것은 _reference_ 변수를 통해 수행됩니다. 값 또는 참조로 전달하는 것은 실제로 언어가 포인터를 지원하는지 여부와 관련이 없습니다. 예를 들어 VB.Net과 C#을 생각해보십시오. –

+0

@ XiaojunChen 나는 우리가 동의하지 않는다고 생각하지 않습니다. 그러나 오해의 소지가있는 것은 MATLAB에 C 언어의 용어를 적용하고 다른 모든 언어에 대해서는 잘 정의하지 않은 것입니다. –