如何复制数组

时间:2014-04-03 19:25:11

标签: arrays matlab matrix

我想制作一个这样的函数

>> 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

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

方法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

方法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])

答案 1 :(得分: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

请注意,此功能仅限于2D矩阵。

答案 2 :(得分:2)

尝试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

答案 3 :(得分:2)

使用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)