2014-02-20 1 views
7

내 프로그램에는 상당한 양의 데이터 (예 : 1000 개의 숫자 및 일부 다른 필드)가있는 구조체 (예 : 100x100) 배열이 있습니다. 예 :Matlab에서 구조체에 "참조"를 만드는 방법은 무엇입니까?

for x = 100 : -1 : 1 
    for y = 100 : -1 : 1 
     database(y,x).data = rand(30); 
     database(y,x).name = sprintf('my %d %d', x, y); 
    end 
end 

데이터를 사용하여 10-20 라인의 코드를 계산하고 싶습니다. 예를 들면 :

for x = 10 : 90 
    for y = 10 : 90 
     for dx = -9 : 9 
      for dy = -9 : 9 
       result = result + database(y + dy, x + dx).data(1, 1); 
       result = result + 2 * database(y + dy, x + dx).data(1, 2) * database(y + dy, x + dx).data(2, 2); 
       ... % more stuff here 
      end 
     end 
    end 
end 

내 코드 database(y + dy, x + dx)로 데이터베이스의 현재 요소를 의미합니다.

temp = database(y + dy, x + dx); 
result = result + temp.data(1, 1); 
result = result + 2 * temp.data(1, 2) * temp.data(2, 2); 

이 내 코드가 훨씬 짧고 명확하게 : 그것은 짧게하기 위해, 나는 그것에 이름 (C++ 그것을 부를 것이다 "참조")를 제공합니다. 그러나 이것은 또한 훨씬 느리며, 프로파일 링은 temp = ... 할당이 내 실행 시간의 70 %를 차지하는 것을 보여줍니다.

그래서 제 가정은 Matlab 입니다.은 내 시간을 먹는 largish 데이터베이스 요소의 내용입니다. 필자는 Matlab이 현명한 "copy-on-write"를 수행 할 수 있어야한다고 생각합니다. 즉, 나중에 변경 될 때만 복사합니다. 그러나 이것은 내 경우에는 발생하지 않습니다 - 내 코드는 데이터베이스에서 읽기만하고 변경하지 않습니다.

구조체에 대한 효율적인 읽기 전용 참조를 만들려면 어떻게해야합니까?

+0

+1 좋은 질문 -이 답변도 알고 싶습니다. 내가 시도한 모든 접근법 (전역 변수를 사용하고 핸들 클래스를 사용하여 함수 인수에서 copy-on-write를 사용)은 코드의 속도가 훨씬 느려졌다. –

+0

'libpointer'를 사용하는 것이 도움이 될 것이라고 생각했지만 포인터를 작성하고 작업하는 것이 생각보다 비용이 많이 든 것 같습니다. – patrickvacek

+4

구조체 배열은 구조체 구조체와 비교할 때 속도가 느립니다. 귀하의 데이터가 허용하는 경우, 배열의 구조체로 변환 해보십시오. 그러면 훨씬 빨라질 것입니다. http://www.mathworks.com/help/matlab/matlab_prog/memory-allocation.html#brh72ex-14 – jerad

답변

1

음, 확실히 당신이 할 때 진행이 복사되어

temp = database(y + dy, x + dx) 

이 사용하여 아마도 감소 될 수있다 : 분명히

temp = database(y + dy, x + dx).data 

을하지만 그건 단지 일하는 것이 당신이 단지 관심이 있다면 코드의이 부분에있는 데이터.

그렇다면 데이터를 구성하는 데 불편한 방법을 사용하지 않고도이 문제를 해결할 수 있는지 확신 할 수 없습니다. 먼저 temp을 모두 database(y + dy, x + dx)으로 대체 한 후 코드를 벤치마킹하여 사본을 피하는 것이 실제로 도움이 될 수 있도록하십시오. 그렇다면 서브 함수에 database(y + dy, x + dx)을 넣으십시오. 서브 함수의 변수는 일반적으로 충분하면 읽기 액세스와 함께 사용됩니다. 그러나 이것이 변수의 일부에 적용되는지 확실하지 않습니다. 행렬 사용을 고려, 데이터의 큰 덩어리에 효율적인 계산을 위해

:

위의 어느 것도,이 책에서 가장 오래된 조언 몇 가지를 고려하지 도움이된다면

.

관련 문제