在我的代码的某些部分,我使用了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更省时,但我不知道方法是什么。有谁有想法吗?
答案 0 :(得分:1)
似乎您的结果(在您的问题fi
中)应该包含vec0
与A
的每一列的差异。这意味着,不是使用repmat
将vec0
扩展为与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