2013-08-02 2 views
2

Вот простой класс с двумя свойствами: PStruct - это свойство, которое будет содержать структуру.Структура структуры Matlab при использовании с объектами

classdef anobj < handle 
    properties 
     PStruct 
     PNum=1; 
    end 
    methods 
     function obj = anobj() 
     end 
    end 
end 

Вот скрипт заполнения структуры в объекте с 1-х (довольно быстро):

clear all 
a = anobj(); % an object 
b = anobj(); % another object for future use 
ntrials=10; niterations=1000; 
a.PStruct(ntrials,niterations).field1=0; % 'initialize' the struct array 
for t=1:ntrials 
    tic; 
    for i=1:niterations 
     a.PStruct(t,i).field1=1; % store data 
    end 
    toc; 
end 

получают:

Elapsed time is 0.001008 seconds. 
Elapsed time is 0.000967 seconds. 
Elapsed time is 0.000972 seconds. 
Elapsed time is 0.001206 seconds. 
Elapsed time is 0.000992 seconds. 
Elapsed time is 0.000981 seconds. 
Elapsed time is 0.000975 seconds. 
Elapsed time is 0.001072 seconds. 
Elapsed time is 0.000951 seconds. 
Elapsed time is 0.000994 seconds. 

Когда вместо этого я использовать свойство другого объекта (= 1), изменяя линию в пределах петель до:

a.PStruct(t,i).field1=b.PNum; % store data 

я получаю:

Elapsed time is 0.112418 seconds. 
Elapsed time is 0.107359 seconds. 
Elapsed time is 0.118347 seconds. 
Elapsed time is 0.127111 seconds. 
Elapsed time is 0.138606 seconds. 
Elapsed time is 0.152675 seconds. 
Elapsed time is 0.162610 seconds. 
Elapsed time is 0.172921 seconds. 
Elapsed time is 0.184254 seconds. 
Elapsed time is 0.190802 seconds. 

не только производительность на несколько порядков медленнее, но есть очень четкая тенденция (проверено в целом) замедления с каждым испытанием. Я не понимаю. Кроме того, если я вместо того, чтобы использовать автономный неинициализированный массив структуры, который не является свойством объекта (эта строка заменяет один в петлях):

PStruct(t,i).field1=b.PNum; % store data 

я получаю ки производительности без каких-либо тенденций:

Elapsed time is 0.007143 seconds. 
Elapsed time is 0.004208 seconds. 
Elapsed time is 0.004312 seconds. 
Elapsed time is 0.004382 seconds. 
Elapsed time is 0.004302 seconds. 
Elapsed time is 0.004545 seconds. 
Elapsed time is 0.004499 seconds. 
Elapsed time is 0.005840 seconds. 
Elapsed time is 0.004210 seconds. 
Elapsed time is 0.004177 seconds. 

Существует некоторое странное взаимодействие между массивами struct и объектами. Кто-нибудь знает, что происходит и как это исправить? Благодарю.

ответ

1

Очень странно.

Я обнаружил, что если вы выполните одно из следующих возвращений коды к нормальной скорости

c = b.PNum; 
a.PStruct(t,i).field1=c; % store data 

или

a.PStruct(t,i).field1=int32(b.PNum); % store data 

, но если вы используете двойной код все еще медленно

a.PStruct(t,i).field1=double(b.PNum); % store data 

, и если вы используете оба метода «быстрого» в то же время

c = b.PNum; 
a.PStruct(t,i).field1=c; % store data 
a.PStruct(t,i).field1=int32(b.PNum); % store data 

медленная скорость возвращается.

+0

Это интересно. В некоторых случаях мне может быть полезно разделить назначение на две команды. Благодарю. – matfan001

Смежные вопросы