矩阵运算中避免使用循环

4
我有一个相当简单的问题,但我在MATLAB中无法得到正确的结果。
我正在编写MATLAB代码,其中有一个200x3矩阵。这些数据对应于10个不同点的记录,对于每个点,我采取了20帧。
这只是为了考虑测量系统中的误差。现在,我想通过计算测量独立坐标的平均值来计算每个点的三维坐标。
例如(对于具有3个测量值的1个点):
MeasuredFrames (Point 1) =
   x         y         z
1.0000    2.0000    3.0000
1.1000    2.2000    2.9000
0.9000    2.0000    3.1000

Point = mean(MeasuredFrames(1:3, :))

Point =

1.0000    2.0667    3.0000

现在我想获取一个包含10个点的结果,这些点都存储在一个[200x3]的数组中,并且每20帧为一个间隔。

有什么想法吗?

提前感谢!


所以基本上你想做的是像mean(MeasuredFrames(1:20,:)),然后是mean(MeasuredFrames(21:40,:))一直到mean(MeasuredFrames(181:200,:)),而不使用循环结构? - GameOfThrows
类似 Des_col=1:20:200; Point=mean(MeasuredFrames(Des_col,:) 的代码是什么意思? - Adiel
是的,那是我的目标!我尝试了很多类似的想法,但都没有得到正确的结果...谢谢大家! - Slash
3个回答

4
如果您拥有图像处理工具箱blockproc可能是一种选择:
A = blockproc(data,[20 3],@(x) mean(x.data,1))

如果不使用以下方法,可以使用permutereshape来完成。
B = permute(mean(reshape(data,20,10,3),1),[2,3,1])

解释:

%// transform data to 3D-Matrix 
a = reshape(data,20,10,3);
%// avarage in first dimension
b = mean(a,1);
%// transform back to 10x3 matrix
c = permute(b,[2,3,1])

一些示例数据:
x = [ 1.0000    2.0000    3.0000
      1.1000    2.2000    2.9000
      0.9000    2.0000    3.1000
      1.0000    2.0000    3.0000
      1.1000    2.2000    2.9000
      0.9000    2.0000    3.1000
      1.0000    2.0000    3.0000
      1.1000    2.2000    2.9000
      0.9000    2.0000    3.1000
      1.1000    2.2000    2.9000]
data = kron(1:20,x.').';  

    A = B =

    1.5150    3.1200    4.4850
    3.5350    7.2800   10.4650
    5.5550   11.4400   16.4450
    7.5750   15.6000   22.4250
    9.5950   19.7600   28.4050
   11.6150   23.9200   34.3850
   13.6350   28.0800   40.3650
   15.6550   32.2400   46.3450
   17.6750   36.4000   52.3250
   19.6950   40.5600   58.3050

非常感谢!我一直在尝试让blockproc起作用,但是对重塑后的数据进行排列的permute函数确实起到了作用!我非常感激你的帮助。太棒了! - Slash
1
arf...我没有看到你已经添加了不需要额外工具箱的解决方案。我的答案现在是多余的。虽然重塑的方法不同,但本质上是相同的方法。 - Hoki
@Slash 我犯了一个错误并进行了更正,请重新检查。 - Robert Seifert
我现在正在看它,但我已经得到了正确的解决方案,将其重塑为块(20,[ ],3)... 无论如何,这些是我需要的函数,现在只是玩弄它们的问题。再次感谢! @thewaywewalk - Slash
@Slash 当然,10个点对应20个样本,我有点困惑。请考虑接受其中一个答案并将问题标记为已解决。(左侧的绿色勾号) - Robert Seifert
当然,我不知道我要做那个!谢谢 @thewaywewalk 的一切。 - Slash

2

如果您没有访问blockproc函数的权限,可以通过reshape的组合来实现:

np = 20 ;                       %// number of points for averaging

tmp = reshape( A(:) , np,[] ) ; %// unfold A then group by "np"
tmp = mean(tmp);                %// calculate mean for each group
B   = reshape(tmp, [],3 ) ;     %// reshape back to nx3 matrix

在您的情况下,将A替换为MeasuredFrames,将B替换为Points,并在一行中进行分组:
Points = reshape(mean(reshape( MeasuredFrames (:) , np,[] )), [],3 ) ; 

0

矩阵乘法可以被使用:

N=20; 
L=size(MeasuredFrames,1); 
Points = sparse(ceil((1:L)/N), 1:L, 1)*MeasuredFrames/N;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接