Circshift matrix by different amount without for loop
4 次查看(过去 30 天)
显示 更早的评论
Hello everyone. I have this 3 dimensional matrix called spectrums and I want to shift the 3rd dimension by different amounts given by vector shifts. Is there a way to do this without using a for loop? something like
shifted_spectrums=arrayfun(@(k) circshift(spectrums(:,:,k),shifts(2:end),2),spectrums);
but a solution that actualy works :P
PS: 3rd dimension of spectrums has 22 elements and shifts has 23 elements, that's why the 2:end.
1 个评论
Jan
2019-3-29
编辑:Jan
2019-3-29
What is the class and contents of shifts(2:end)? What is not "actually working"?
We cannot guess these details.
A for loop is faster than arrayfun in general. So please mention, why you want to avoid it.
Is this the loop version?
shifted_spectrums = zeros(size(spectrums));
for k = 1:size(spectrums, 3)
shifted_spectrums(:, :, k) = circshift( ...
spectrum(:, :, k), shifts(k+1), 2);
end
采纳的回答
Javier Agustin Romero
2019-3-29
编辑:Javier Agustin Romero
2019-3-29
更多回答(1 个)
Jan
2019-3-29
编辑:Jan
2019-3-29
Try:
n = 8192;
spectrums = rand(512, n, 22);
shifts = randi(n, 1, 22);
tic
s1 = cell2mat(arrayfun(@(k) ...
circshift(spectrums(:,:,k), shifts(k), 2),1:22,'uni',0));
toc
tic;
s2 = zeros(size(spectrums));
for k = 1:22
s2(:,:,k)=circshift(spectrums(:,:,k), shifts(k), 2);
end
toc
For n=2000 I get:
arrayfun: 0.22sec
loop: 0.17sec
3 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!