【问题标题】:how to replicate an array如何复制数组
【发布时间】:2014-05-15 20:09:06
【问题描述】:

我想做一个这样的功能

>> matdup([1 2],3,4)            %or any other input that user wish to enter
ans= 

 1     2     1     2     1     2     1     2
 1     2     1     2     1     2     1     2
 1     2     1     2     1     2     1     2

我被困在我的代码中。我的逻辑:

m = matdup(input,row,col)
for i = 1:row
        for j = 1:col
            m(i, j)= input;

这是产生这个:

>> matdup(1,2,2)
ans=

      1 1
      1 1

但失败了:

>> matdup([1 2],3,4)

控制台出错:

Subscripted assignment dimension mismatch.

    Error in ==> matdup at 6
                m(i, j)= input

有什么想法吗?

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    方法一:你可以使用ones吗?试试这个 -

    A = [1 2]
    
    rowIdx = [1 : size(A,1)]';
    colIdx = [1 : size(A,2)]';
    
    out = A(rowIdx(:, ones(3,1)), colIdx(:, ones(4,1)))
    

    输出

    out =
    
         1     2     1     2     1     2     1     2
         1     2     1     2     1     2     1     2
         1     2     1     2     1     2     1     2
    

    方法二:你可以使用bsxfunpermute吗?试试这个以获得相同的结果 -

    A = [1 2]
    row_mapped = bsxfun(@plus,A,zeros(3,1))
    out = reshape(bsxfun(@plus,row_mapped,permute(zeros(4,1),[3 2 1])),[3 8])
    

    【讨论】:

    • @user3440716 又增加了一种方法!
    【解决方案2】:

    Matlab 有一个名为 repmat 的函数,其作用相同。

    如果你想创建一个类似的函数,你可以这样做:

    function B = matdup(A, M, N)
        [nr, nc] = size(A);
        B = zeros([nr nc] .* [M N]);
        for r = 1:M
            for c = 1:N
                rr = (r - 1) * nr + 1;
                cc = (c - 1) * nc + 1;
                B(rr:rr + nr - 1, cc:cc + nc - 1) = A;
            end
        end
    end
    

    请注意,此功能仅限于二维矩阵。

    【讨论】:

    • 我不允许这样做。任何其他事情。我有想法,但不相信,例如考虑规模和实施。但我想不出下一步该做什么。是否可以查看库它们是如何发挥作用的?
    【解决方案3】:

    试试kron:

    matdup = @(x,m,n) kron(ones(m,n),x)
    

    演示:

    >> A = [5 6 7];
    >> out = matdup(A,3,2)
    out =
         5     6     7     5     6     7
         5     6     7     5     6     7
         5     6     7     5     6     7
    

    请注意,您可以将输入切换为 kron 以有效地复制元素而不是整个矩阵:

    repel = @(x,m,n) kron(x,ones(m,n));
    

    演示:

    >> A = [5 6 7];
    >> out = repel(A,3,2)
    out =
         5     5     6     6     7     7
         5     5     6     6     7     7
         5     5     6     6     7     7
    

    【讨论】:

      【解决方案4】:

      使用mod可以轻松完成复制:

      function R = matdup(A, M, N)
          [m n]= size(A);
          R = A(mod(0:m*M-1,m)+1, mod(0:n*N-1,n)+1)
      

      【讨论】:

      • 在某个时间段生成步数的巧妙方法。 +1
      猜你喜欢
      • 2012-03-13
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2013-05-28
      相关资源
      最近更新 更多