MATLAB:如何在没有循环的情况下计算(on)子矩阵

时间:2013-02-21 15:43:35

标签: matlab loops for-loop matrix submatrix

我想将矩阵按列分成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

谢谢!

3 个答案:

答案 0 :(得分:3)

在框外思考:使用第三维:

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

第一行产生一个3d数组,第一个矩阵位于r(:,:,1),第二个位于r(:,:,2),...(如果数字为M(:,1:seg*segLen),则使用M列不能被segLen整除。 mean(r,2)生成一个逐个逐个seg数组,squeeze再次生成一个nrows-by - seg矩阵。

答案 1 :(得分:1)

您可以将arrayfuncell2mat

一起使用
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

其中每列代表一个子矩阵的平均值。

使用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',则true可以利用并行处理,即result2 = blockproc(M, [N, segLen], myFun, 'UseParallel', true)

答案 2 :(得分:0)

您可以为您的示例案例

执行此操作
mean1 = mean(M(:,1:segLen))
mean2 = mean(M(:,segLen+1:N-segLen-1))
mean3 = mean(M(:,N-segLen:end))