优化使用repmat的matlab代码

时间:2017-10-03 07:48:18

标签: matlab optimization

在我的代码的某些部分,我使用了repmat来处理一个非常大的向量

select  *
from    (
        select  lag(plan) over (order by id desc) as prev_plan
        ,       *
        from    YourTable
        ) yt
where   plan <> prev_plan
        or prev_plan is null

vec是1乘400矩阵,'A'是3600乘400矩阵。我认为应该比使用repmat更省时,但我不知道方法是什么。有谁有想法吗?

2 个答案:

答案 0 :(得分:1)

似乎您的结果(在您的问题fi中)应该包含vec0A的每一列的差异。这意味着,不是使用repmatvec0扩展为与A相同的大小(通过生成400个重复),您可以将元素操作应用于两个隐式数组使用bsxfun进行扩展。使用此功能不会复制vec0,但应达到相同的效果。第一个参数指定要应用于两个数组的函数,这里只是minus

result = bsxfun(@minus, vec0.', A);

答案 1 :(得分:0)

以下是要使用的模板测试,包括mikkola's answer

vec = rand(1,400);
A = rand(3600,400);
n_expts = 1000;
format long
disp(version);

% Warm up
for ii = 1:n_expts
    vec0 = repmat(vec,1,9);
    res1 = repmat(vec0',1,400)-A;
    res3 = bsxfun(@minus, vec0.', A);
end

tic
for ii = 1:n_expts
    vec0 = repmat(vec, 1, 9);
    res1 = repmat(vec0.', 1, 400) - A;
end
fprintf('Time taken with 2 repmats: ')
disp(toc/n_expts)

tic
for ii = 1:n_expts
    res2 = repmat(vec.', 9, 400) - A;
end
fprintf('Time taken with 1 repmat and transpose: ')
disp(toc/n_expts)

tic
for ii = 1:n_expts
    res3 = bsxfun(@minus, vec0.', A);
end
fprintf('Time taken with bsxfun: ')
disp(toc/n_expts)

% Check that all the fi are the same
dres1 = max(max(abs(res1 - res2)));
dres2 = max(max(abs(res1 - res3)));
tol = eps;
if (dres1 > eps) | (dres2 > eps)
    fprintf('Difference in output matrices');
end

结果

8.3.0.532 (R2014a)
Time taken with 2 repmats:    0.004027661867427

Time taken with 1 repmat and transpose:    0.004034170491803

Time taken with bsxfun:    0.003970521454027