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

初期化を行うと、非常に高速に動作するようになると思います。もう 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 を 1 つの行に変換します (実際には列も機能しますが、問題ではありません)。

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 に答える