【问题标题】:Select rolling rows without a loop选择没有循环的滚动行
【发布时间】:2012-05-24 08:46:16
【问题描述】:

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

 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 分钟。

【问题讨论】:

  • 重塑功能在我的情况下如何工作?我是 MATLAB 新手

标签: performance matlab loops matrix


【解决方案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.

【讨论】:

  • +1:@petrichor 不错。我正要给出类似的答案,但你抢先了。
  • 好的,我还不熟悉网站规则,我该怎么做?点击“这篇文章对你有用吗?”
【解决方案2】:

我不会在循环中使用 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 的更多信息

【讨论】:

    【解决方案3】:

    我现在没有 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(:)]
    

    【讨论】:

    • 好的,现在对大小为3280x35n=3 的A 执行此操作。这会让你忙着打字好几个小时:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多