【发布时间】:2020-01-24 17:36:01
【问题描述】:
我目前正在寻找移动和重新排列大型矩阵的最有效方法。从本质上讲,我有一些抛物线位移的数据需要进行校正,以便将“信号”转变为线性事件。
我目前尝试了以下解决方案并尝试对其进行计时。有没有其他可能被证明更有效的方法?
DATA = ones(100000,501);
DATA(10000,251) = 100;
for i=1:250
DATA(10000+i^2-1000:10000+i^2+1000,251-i) = 100;
DATA(10000+i^2-1000:10000+i^2+1000,251+i) = 100;
end
k = abs(-250:1:250).^2;
d = size(DATA,1);
figure(99)
imagesc(DATA)
t_INDEX = timeit(@()fun_INDEX(DATA,k))
t_SNIPPET = timeit(@()fun_SNIPPET(DATA,k))
t_CIRCSHIFT = timeit(@()fun_CIRCSHIFT(DATA,k))
t_INDEX_clean = timeit(@()fun_INDEX_clean(DATA,k))
t_SPARSE = timeit(@()fun_SPARSE(DATA,k))
t_BSXFUN = timeit(@()fun_BSXFUN(DATA,k))
function fun_INDEX(DATA,k)
DATA_1 = zeros(size(DATA));
for i=1:size(DATA,2)
DATA_1(:,i) = DATA([k(i)+1:end 1:k(i)],i);
end
figure(1)
imagesc(DATA_1)
end
function fun_SNIPPET(DATA,k)
kmax = max(k);
DATA_2 = zeros(size(DATA,1)-kmax,size(DATA,2));
for i=1:size(DATA,2)
DATA_2(:,i) = DATA(k(i)+1:end-kmax+k(i),i);
end
figure(2)
imagesc(DATA_2)
end
function fun_CIRCSHIFT(DATA,k)
DATA_3 = zeros(size(DATA));
for i=1:size(DATA,2)
DATA_3(:,i) = circshift(DATA(:,i),-k(i),1);
end
figure(3)
imagesc(DATA_3)
end
function fun_INDEX_clean(DATA,k)
[m, n] = size(DATA);
k = size(DATA,1)-k;
DATA_4 = zeros(m, n);
for i = (1 : n)
DATA_4(:, i) = [DATA((m - k(i) + 1 : m), i); DATA((1 : m - k(i) ), i)];
end
figure(4)
imagesc(DATA_4)
end
function fun_SPARSE(DATA,k)
[m,n] = size(DATA);
k = -k;
S = full(sparse(mod(k,m)+1,1:n,1,m,n));
DATA_5 = ifft(fft(DATA).*fft(S),'symmetric');
figure(5)
imagesc(DATA_5)
end
function fun_BSXFUN(DATA,k)
DATA = DATA';
k = -k;
[m,n] = size(DATA);
idx0 = mod(bsxfun(@plus,n-k(:),1:n)-1,n);
DATA_6 = DATA(bsxfun(@plus,(idx0*m),(1:m)'));
figure(6)
imagesc(DATA_6)
end
有没有办法减少这类问题的计算时间?
提前感谢您的任何提示!
【问题讨论】:
-
请准确、简洁地描述“移栏”,你想达到什么目的?您提供了几种不同的解决方案,它们的相对性能如何?太慢有多慢?
-
我已经回答了a really similar question。看看吧。
标签: matlab for-loop matrix optimization