gpt4 book ai didi

arrays - 使用索引值的环移

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

我一直在寻找一种使用索引值进行 circshift 的方法。

我知道我可以使用 circshift 命令移动所有值,如下所示

a=[1:9]
b=circshift(a,[0,1])

但是我如何将每第 3 个值移到 1 之上呢?例子:注意:变量a可以是任意长度

a=[1,2,30,4,5,60,7,8,90] %note variable `a` could be any length

我正在努力让 b 成为

b=[1,30,2,4,60,5,7,90,8]  % so the values in the index 3,6 and 9 are shifted over 1.

最佳答案

您将无法使用 circshift 的标准用法来执行此操作。还有其他几种方法可以解决这个问题。这里只是其中的一部分。

使用mod创建索引值

您可以使用 mod 从位置 3:3:end 处的索引值中减去 1,并将 1 添加到位置处的索引值位置 2:3:end

b = a((1:numel(a)) + mod(1:numel(a), 3) - 1);

解释

1:numel(a) 上调用 mod 3 产生以下序列

mod(1:numel(a), 3)
% 1 2 0 1 2 0 1 2 0

如果我们从这个序列中减去 1,我们会得到给定索引的“移位”

mod(1:numel(a), 3) - 1
% 0 1 -1 0 1 -1 0 1 -1

然后我们可以把这个移位加到原来的索引上

(1:numel(a)) + mod(1:numel(a), 3) - 1
% 1 3 2 4 6 5 7 9 8

然后将a中的值赋给b中的这些位置。

b = a((1:numel(a)) + mod(1:numel(a), 3) - 1);
% 1 30 2 4 60 5 7 90 8

使用 reshape

另一种选择是将数据重新整形为 3 x N 数组并翻转第 2 行和第 3 行,然后重新整形为原始大小。 此选项仅在 numel(a) 可被 3 整除 时有效。

tmp = reshape(a, 3, []);

% Grab the 2nd and 3rd rows in reverse order to flip them
b = reshape(tmp([1 3 2],:), size(a));

关于arrays - 使用索引值的环移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37575728/

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