repmat,矩阵的大小或使用次数

时间:2014-10-12 11:47:20

标签: matlab

我有一个矩阵,我为每个列提取并为每个列执行repmat函数以构建另一个矩阵。因为我必须为大量向量(我的第一个矩阵的每一列)执行此操作,所以需要很长时间(相对于我期望的那样)。如果我为整个矩阵执行此操作然后执行某些操作来构建它们,是否需要更少的时间?

以此为例:

A=[1 4 7;2 5 8;3 6 9]

我想制作这些

A1=[1 2 3 1 2 3 1 2 3
    1 2 3 1 2 3 1 2 3
    1 2 3 1 2 3 1 2 3]
A2=[4 5 6 4 5 6 4 5 6
    4 5 6 4 5 6 4 5 6
    4 5 6 4 5 6 4 5 6]
A3=[7 8 9 7 8 9 7 8 9
    7 8 9 7 8 9 7 8 9
    7 8 9 7 8 9 7 8 9]

2 个答案:

答案 0 :(得分:1)

尝试这是否符合您的需求:

A = [1 4 7;2 5 8;3 6 9];
n = 3;  %// size(A,1)

cellArrayOutput = arrayfun(@(x) repmat( A(:,x).',n,n ), 1:size(A,2), 'uni',0)

而不是不同的变量名,所有内容都存储在单元格数组中。

如果你坚持使用不同的名字,我建议使用结构:

A = [1 4 7;2 5 8;3 6 9];
n = 3;

structOutput = struct;
for ii = 1:size(A,2)
    structOutput.(['A' num2str(ii)]) = repmat( A(:,ii).', n, n );
end

给你:

>> structOutput.A1

ans =

     1     2     3     1     2     3     1     2     3
     1     2     3     1     2     3     1     2     3
     1     2     3     1     2     3     1     2     3

等等。

我不希望获得更多性能,您应该分享完整的代码以获得进一步的帮助。

答案 1 :(得分:1)

作为@thewaywewalk的回答并使用kron和repmat:

clear

A=[1 4 7;2 5 8;3 6 9];

B = repmat(kron(A',ones(3,1)),1,3);


A1 = B(1:3,:)
A2 = B(4:6,:)
A3 = B(7:end,:)

结果如下:

A1 =

     1     2     3     1     2     3     1     2     3
     1     2     3     1     2     3     1     2     3
     1     2     3     1     2     3     1     2     3


A2 =

     4     5     6     4     5     6     4     5     6
     4     5     6     4     5     6     4     5     6
     4     5     6     4     5     6     4     5     6


A3 =

     7     8     9     7     8     9     7     8     9
     7     8     9     7     8     9     7     8     9
     7     8     9     7     8     9     7     8     9

或者@Divakar指出,建议创建一个3D数组并将所有数据存储在其中(一般解决方案):

n = 3; %// # of times you want to repeat the arrays.

A=[1 4 7;2 5 8;3 6 9];

B = repmat(kron(A',ones(n,1)),1,n);
C = zeros(n,n*size(A,2),3);

C(:,:,1) = B(1:n,:);
C(:,:,2) = B(n+1:2*n,:);
C(:,:,3) = B(2*n+1:end,:);