我想将矩阵按列分成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
谢谢!
答案 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)
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))