2

我有个问题。假设我有矩阵 A =

 1     2     3
 4     5     6
 7     8     9
10    11    12

我需要从 A 中选择 n 个滚动行,并将新矩阵 C 中的元素按行转置。我使用的循环是:

n = 3;     %for instance every 3 rows of A

B = []; 

for i = 1:n 

    Btemp = transpose(A(i:i+size(A,1)-n,:)); 

    B = [B;Btemp]; 

end

C=B';

并产生矩阵C,即:

C =

 1     2     3     4     5     6     7     8     9
 4     5     6     7     8     9    10    11    12

这也是我想做的,但我可以在没有循环的情况下做同样的工作吗?

计算一个 3280x35 大小的 A 矩阵需要 4 分钟。

4

3 回答 3

1

我认为如果你进行初始化,你可以让它工作得非常快。另一个技巧是先进行转置,因为 MATLAB 使用列而不是行作为第一个索引。

tic
A =  reshape(1:3280*35,[3280 35])'; %# Generate an example A
[nRows, nCols] = size(A);

n = 3; %for instance every 3 rows of A
B = zeros(nRows-n+1,nCols*n);
At = A';
for i = 1:size(B,1)
    B(i,:) = reshape(At(:,i:i+n-1), [1 nCols*n]); 
end
toc

经过的时间是

Elapsed time is 0.004059 seconds.
于 2012-05-24T09:01:46.373 回答
0

我不会在循环中使用 reshape ,而是先将 A 转换为单行(实际上一列也可以,没关系)

Ar = reshape(A',1,[]); % the ' is important here!

那么从 Ar 中选择元素非常简单:

[nrows, ncols] = size(A);
new_ncols = ncols*n;
B = zeros(nrows-(n-1),new_ncols);

for ii = 1:nrows-(n-1)
    B(ii,:) = Ar(n*(ii-1)+(1:new_ncols));
end

尽管如此, , 的预分配B给你最大的改进:更多信息在http://www.mathworks.nl/help/techdoc/matlab_prog/f8-784135.html

于 2012-05-24T09:29:30.137 回答
0

我现在没有 Matlab,但我认为你可以在没有这样的循环的情况下做到这一点:

reshape(permute(cat(A(1:end-1,:),A(2:end,:),3),[3,2,1]), [2, size(A,2)*(size(A,1) - 1)]);

事实上这不会做你想要的吗?:

A1 = A(1:end-1,:);
A2 = A(2:end,:);
answer = [A1(:) ; A2(:)]
于 2012-05-24T11:48:19.567 回答