使用不同大小的输入提高repmat和功能的效率

时间:2018-06-28 12:01:22

标签: matlab function vectorization

我编写了一个代码,该代码在每个时间步执行一些计算(Euler方法)。 在计算中,我有几组元素,原则上可以有不同的大小。 需要对每个元素(X2_elements,Y_elements)计算一些数量,原则上只能对每个组(X,Z)计算其他数量。

代码正常工作,但是我确定了两个不合理的点,这些点不合理地降低了计算速度。 我相信这两个问题的问题在于我正在以低效的方式处理矩阵并将函数应用于它们。

请在测试代码下面找到我突出显示的两个问题。

其他说明:

-我真的不需要矩阵X_elements和Z_matrices;我计算它们只是将它们与myFunction中的Y_elements(我确实需要)一起应用。

-通常,每组中的元素数量为20至60个元素。

我想找到:

  1. 一种计算X_elements2的更有效方法,该方法目前在for循环中使用repmat。

  2. 将myFunction应用于输入的效率更高,可能使用更小的X和Z,而不是X_elements和Z_elements。

谢谢!

% Inputs
% nGroups: number of groups
% nElements: total number of elements
% nE: (1 x nGroups) vector indicating how many elements there are in each group
% elementToGroup: (1 x nElements) vector indicating to which group each element belongs
% Z: (1 x nGroups) vector with constant values (never updated during the calculation)
% fScalar: scalar parameter

% Initialization
X=zeros(nTime,nGroups);
X2=zeros(nTime,nGroups);
X_elements=zeros(nTime,nElements);
X_elements2=zeros(nTime,nElements);
Y_elements=zeros(nTime,nElements);
W_elements=zeros(nTime,nElements);
% Make cell structure containing indices of elements in  each group
belongToG=cell(nGroups,1);
for g=1:nGroups
    belongToG{g}=find(elementToGroup==g);
end
% Calculate once Z_elements
Z_elements=zeros(1,nElements);
for g=1:nGroups
    Z_elements(belongToGroup{g})=Z(g);
end

% Main for-loop
for n=1:nTime
    % do stuff... and a new row of the X, X2, Y_elements matrices are calculated
    % Problem 1: Write values in all elements of each group
    for g=1:nGroups

        X_elements(n,belongToGroup{g})=repmat(X(n,g),1,nE(g)); % slow! :(
        X_elements2(n,belongToGroup{g})=repmat(X2(n,g),1,nE(g)); % slow! :(
    end
% do more stuff...
% Problem 2: Use the values in the new row of the matrices in a function
W_elements(n,:) = myFunction(X_elements(n,:),Y_elements(n,:),Z_elements,fScalar); % slow :(
% do more stuff...
end

0 个答案:

没有答案