내 프로그램에는 상당한 양의 데이터 (예 : 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"를 수행 할 수 있어야한다고 생각합니다. 즉, 나중에 변경 될 때만 복사합니다. 그러나 이것은 내 경우에는 발생하지 않습니다 - 내 코드는 데이터베이스에서 읽기만하고 변경하지 않습니다.
구조체에 대한 효율적인 읽기 전용 참조를 만들려면 어떻게해야합니까?
+1 좋은 질문 -이 답변도 알고 싶습니다. 내가 시도한 모든 접근법 (전역 변수를 사용하고 핸들 클래스를 사용하여 함수 인수에서 copy-on-write를 사용)은 코드의 속도가 훨씬 느려졌다. –
'libpointer'를 사용하는 것이 도움이 될 것이라고 생각했지만 포인터를 작성하고 작업하는 것이 생각보다 비용이 많이 든 것 같습니다. – patrickvacek
구조체 배열은 구조체 구조체와 비교할 때 속도가 느립니다. 귀하의 데이터가 허용하는 경우, 배열의 구조체로 변환 해보십시오. 그러면 훨씬 빨라질 것입니다. http://www.mathworks.com/help/matlab/matlab_prog/memory-allocation.html#brh72ex-14 – jerad