【问题标题】:circshift using index values使用索引值的 circshift
【发布时间】:2016-06-01 17:58:06
【问题描述】:

我正在寻找一种使用索引值进行循环移位的方法。

我知道我可以使用下面的 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.

【问题讨论】:

    标签: arrays matlab octave


    【解决方案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));
    

    【讨论】:

    • 我注意到如果我向a 添加了另一个值,它似乎不起作用,有解决方法吗?我更新了问题以添加注释变量a 可以是任意长度。
    • @RickT 真的吗?第一个解决方案不起作用?它应该适用于a 的任何大小。第二种解决方案取决于大小。我添加了一个声明来澄清这一点。
    • 我收到第一个错误消息。错误:调整大小操作无效或对越界数组元素的分配不明确这是我尝试过的
    • @RickT 你能告诉我错误信息是什么吗?还有a的大小是多少?
    • 这是我试过的a = [1,2,30,4,5,60,7,8,90,999] b((1:numel(a)) + mod(1:numel(a), 3) - 1) = a;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多