我有一个矩阵,我为每个列提取并为每个列执行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]
答案 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,:);