2017-11-29 17 views
2

음, Matlab에서 알고리즘을 구현하려고합니다. for 루프 내에 고차원 배열의 조각을 사용해야합니다. 논리적 인 인덱싱을 사용하려고하면 Matlab은 해당 슬라이스의 복사본을 추가로 만들고 배열이 크기 때문에 많은 시간이 걸립니다.Matlab에서 추가 메모리를 사용하지 않고 하위 배열을 만들 수 있습니까?

slice = x(startInd:endInd); 

내가하려는 것은 복사하지 않고 해당 슬라이스를 사용하는 것입니다. 선형 연산자를 입력하기 위해 슬라이스 데이터가 필요합니다. 반복하는 동안 해당 부분을 업데이트하지 않겠습니다.

이렇게하려면 출력이 double 유형 배열이고 크기가 원하는 슬라이스 데이터 크기와 동일한 Mex 파일을 작성하려고했습니다.

plhs[0] = mxCreateUninitNumericMatrix(0, 0, mxDOUBLE_CLASS,mxREAL); % initialize but do not allocate any additional memory 
ptr1 = mxGetPr(prhs[0]); % get the pointer of the input data 

그런 다음 출력 포인터를 입력 데이터의 시작 인덱스로 설정하십시오.

시작 인덱스를 0으로 설정하면 정상적으로 작동합니다. 에 0보다 다른 값을 지정하려고하면 Mex 파일이 오류없이 컴파일되지만 Mex 함수가 호출되면 Matlab이 충돌합니다.

slice = mex_slicer(x, startInd, endInd); 

여기에는 어떤 문제가있을 수 있습니까?

+0

for 루프에서이 어레이 슬라이스에 실제로 액세스해야하는 방법을 보여줄 수 있습니까? 중간 변수에 할당하지 않아도 될까요? – nekomatic

+0

mex 파일에서 두 개의 matlab 변수에 동일한 메모리 영역을 지정하면 충돌이 발생합니다. Matlab은이 작업을 수행했음을 알지 못하고 변수 중 하나를 재 할당 할 때 충돌합니다. 메모리를 복사하지 않으려면 슬라이스 사본을 별도의 변수에 작성하지 말고 원래의 큰 필드를 색인화하십시오. 귀하의 예제와 같이 인덱스 배열을 사용하면됩니다. 그러나 나는 matlab이 데이터를 내부적으로 복사하지 않을 것이라고 절대 확신하지는 않습니다. –

+0

중간 변수에 할당하지 않더라도 동일한 문제가 여전히 존재합니다. 그 이유는, 내가 생각하기에, 그것은; 논리적 색인을 수행 할 때 'size = size ([startInd : endInd])'의 색인 배열을 만듭니다. 그래서 내가 여기서하려고하는 것은 약간의 해킹입니다. 포인터가있는 곳을 알 수있는 메모리 장소에 포인터를 놓고 그 메모리 다음에 몇 개의 요소를 가져 오는지 알려줍니다. 나는 어떤 인덱스 배열도 만들고 싶지 않다. (인덱스 배열의 크기는 200 만 개 정도). – Fatih

답변

0

데이터 포인터를 배열에 할당하는 방식은 배열이 삭제되거나 다른 것이 할당되었을 때 MATLAB이 해당 메모리를 해제하려고 시도한다는 것을 의미합니다. malloc으로 얻지 못한 포인터를 사용하여 free을 호출하면 충돌이 발생합니다.

MATLAB은 다른 배열의 부분을 가리키는 배열 인 "보기"를 지원하지 않습니다. 그래서 당신이하고 싶은 일을 할 방법이 없습니다. 은 (예를 들어, 작은 배열에서) 인덱스에 많은 시간이 소요되지 않도록, 다른 데이터

  • 가기 :

    대체 솔루션에 있을까?

  • 큰 데이터 블록의 하위 범위를 매우 쉽게 가리킬 수있는 MEX- 파일 내에서 C 또는 C++로 모든 계산을 수행하십시오.