4

私はメインマトリックスを持っています

A=magic(5);

また、ベクトル

v=[1;3;5;2;2];

この方法で A の要素を行単位で合計したい: 最初の行を v(1) 番目の要素から最後に追加し、2 行目を v(2) 番目の要素から最後に追加し、3 行目を v から追加する(3) 番目の要素から最後まで、など。

forループを使用してこれを行うことができることを知っています。しかし、それを行うベクトル化された方法があるかどうか知りたいです。

編集: 私の質問を例で明確にしましょう:上記のようにAとvを想定してください。

A =

 17    24     1     8    15
 23     5     7    14    16
  4     6    13    20    22
 10    12    19    21     3
 11    18    25     2     9

v =

 1
 3
 5
 2
 2

ここで、次の結果を取得する方法が必要です。

answer =
 65  % 17+24+1+8+15
 37  % 7+14+16
 22  % 22
 55  % 12+19+21+3
 54  % 18+25+2+9
4

2 に答える 2

4

cumsum列に沿って使用できます。ソリューションは少し複雑なので、より簡単な例から始めます。

i-th 番目の行Aまで (を含む) -th 番目の行のすべての要素を合計したいとしますv(i): res_i = \sum_{k=1..v(i)} A_ik

m = size(A,1); % num of rows
csA = cumsum(A, 2); % cumsum along rows
res = csA( sub2ind( size(A), 1:m, v ) ); % pick the vi-th column for the i-th row

さて、あなたの質問については、すべての要素の合計を最後 まで求めるので、それに応じv(i)て反転Aして変更する必要がありますv

[m n] = size(A);
fA = fliplr(A);
fv = n + 1 - v; % flip the meaning of v
csA = cumsum( fA, 2 ); 
res = csA( sub2ind( [m n], 1:m, fv ) ); % should do the trick...
于 2013-04-25T13:18:02.390 に答える
3

私はそれがちょっとした不正行為であることを知っていますが、どうですか:

S = arrayfun(@(ii) sum(A(ii, v(ii):end)), 1:size(A,1)).';

通常、私は を使用しているときは少し疲れていますarrayfunが、比較すると次のようになります。

% sample data
N = 5000;

A = magic(N);
v = randi(N, N,1);


% simple loop
tic
    S = zeros(N,1);
    for ii = 1:N
        S(ii) = sum(A(ii, v(ii):end));
    end
toc


% arrayfun solution    
tic
    S = arrayfun(@(ii) sum(A(ii, v(ii):end)), 1:N).';
toc

% Shai's solution 
tic
    [m n] = size(A);
    fA = fliplr(A);
    fv = n + 1 - v; 
    csA = cumsum( fA, 2 ); 
    res = csA( sub2ind( [m n], 1:m, fv.' ) ).';
toc

結果:

Elapsed time is 0.386280 seconds. % simple loop
Elapsed time is 0.473916 seconds. % arrayfun
Elapsed time is 0.495794 seconds. % Shai's solution

だから、arrayfunやっぱり悪くない。

ただし、ここで重要な点があります。遠くから実装を見てください。ループ ソリューションは読みやすく/理解しやすかったですか? ベクトル化されたソリューションはどうですか?

これを念頭に置いて、パフォーマンスも見てください。これは 5000x5000 の行列の場合です... 2,500の要素があります...

さて、あなたは本当にそのループを避けたいですか?

于 2013-04-25T13:44:53.427 に答える