gpt4 book ai didi

matlab - 如何在没有循环的情况下逐列执行矩阵的循环移位

转载 作者:太空宇宙 更新时间:2023-11-03 20:05:16 25 4
gpt4 key购买 nike

我需要循环移动矩阵的各个列。

如果您想将所有列移动相同的量,这很容易,但是,在我的例子中,我需要将它们全部移动不同的量。

目前我正在使用循环,如果可能的话我想删除循环并使用更快的基于矢量的方法。

我当前的代码

A = randi(2, 4, 2);
B = A;
for i = 1:size( A,2 );
d = randi( size( A,1 ));
B(:,i) = circshift( A(:,i), [d, 0] );
end

是否可以从此代码中删除循环?

更新 我测试了所有三种方法并将它们与这个问题中描述的循环进行了比较。我计算了在 1000x1000 矩阵上逐列循环移位执行 100 次需要多长时间。我多次重复这个测试。

结果:

  • 我的循环花费了超过 12 秒
  • 在一秒内追求建议
  • Zroth 最初的回答只用了 2 秒多一点
  • Ansari 的建议比原来的循环慢

最佳答案

编辑

追求是正确的:使用 for 循环和适当的索引似乎是解决问题的方法。这是一种方法:

[m, n] = size(A);
D = randi([0, m - 1], [1, n]);
B = zeros(m, n);

for i = (1 : n)
B(:, i) = [A((m - D(i) + 1 : m), i); A((1 : m - D(i) ), i)];
end

原始答案

我以前也找过类似的东西,但一直没有找到好的解决方案。对所用算法之一的修改here在我的测试中提供了轻微的性能提升:

[m, n] = size(A);
mtxLinearIndices ...
= bsxfun(@plus, ...
mod(bsxfun(@minus, (0 : m - 1)', D), m), ...
(1 : m : m * n));
C = A(idxs);

丑陋?确实。就像我说的,它似乎稍微快一点(对我来说快 2--3 倍);但是对于 m = 3000n = 1000(在一台相当旧的计算机上也是如此),这两种算法的计时都不到一秒。

可能值得注意的是,对我来说,这两种算法似乎都优于 Ansari 提供的算法,尽管他的回答肯定更直接。 (Ansari 算法的输出与我的其他两种算法不一致;但这可能只是应用转换方式的差异。)一般来说,arrayfun 在我尝试时似乎很慢使用它。单元阵列对我来说似乎也很慢。但我的测试可能存在某种偏差。

关于matlab - 如何在没有循环的情况下逐列执行矩阵的循环移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11584711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com