【问题标题】:Optimization of column shifting of large matrices (Circshift, etc.)大型矩阵的列移位优化(Circshift等)
【发布时间】: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


【解决方案1】:

如果您的工作站有 GPU,一个选项是使用 MATLAB 的 GPU 函数。根据整个数据是否同时适合 GPU,它将开始在 1000 X 1000 矩阵大小时优于 CPU circshift。

该实现只需要你用一条语句将数据复制到 GPU,然后对新创建的数组进行 circshift 操作。

可以在这里找到关于其性能的小讨论:https://www.mathworks.com/matlabcentral/answers/274619-circshift-slower-on-gpu。特别是,最后一篇文章描述了一个更快的 GPU 实现,如果您实际上不需要循环移位,但可以在一侧通过零,这可能是相关的。

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多