2

行列を列方向に3つのセグメントに分割し、計算を実行したいと思います(mean())。この提供されたサンプルで行ったように、forループなしでこれを取得する方法はありますか?

M = [2 4 9; 50 50 200; 30 0 0];
M = [M 10*M]
N = length(M);
seg = 3 % split in lets say 3 parts
segLen = round(N/seg)
segBeg = (((1:seg)-1) * segLen)+1  % start indices
segEnd = segBeg + segLen -1        % end indices

for i = 1: length(segBeg)
    mean(M(:,segBeg(i):segEnd(i)),2)
end

ありがとうございました!

4

3 に答える 3

3

ボックスの外側を考えてください:3次元を使用してください:

r=reshape(M,size(M,1),segLen,[])
squeeze(mean(r,2))

最初の行は、最初の行列が、、 r(:,:,1)2番目の行列がr(:,:,2)、...の3D配列を生成します(列の数がで割り切れない場合は、M(:,1:seg*segLen)instreadを使用してください)。 nrows-x-1 by- arrayを生成し、それからnrows-by- matrixを再度作成します。MsegLenmean(r,2)segsqueezeseg

于 2013-02-21T16:11:36.983 に答える
1

arrayfunと一緒に使用できますcell2mat

result = cell2mat(arrayfun(@(x,y) mean(M(:,x:y),2), segBeg, segEnd,...
   'UniformOutput', false))

これにより、

result =

   1.0e+03 *

    0.0030    0.0145    0.0650
    0.0500    0.3500    1.2500
    0.0150    0.1500         0

ここで、各列は1つの部分行列全体の平均を表します。

blockproc(コメントで@DennisJaheruddinによって提案されたような)を使用する別のソリューションは、次のようになります。

myFun = @(x) mean(x.data,2);

result2 = blockproc(M, [N, segLen], myFun)

これにより、

result2 =

   1.0e+03 *

    0.0030    0.0145    0.0650
    0.0500    0.3500    1.2500
    0.0150    0.1500         0

フラグがに設定されてblockprocいる場合、並列処理を利用できることに注意してください。'UseParallel'trueresult2 = blockproc(M, [N, segLen], myFun, 'UseParallel', true)

于 2013-02-21T15:59:09.797 に答える
0

あなたはあなたの例の場合のために行うことができます

mean1 = mean(M(:,1:segLen))
mean2 = mean(M(:,segLen+1:N-segLen-1))
mean3 = mean(M(:,N-segLen:end)) 
于 2013-02-21T15:56:45.897 に答える