【问题标题】:Operations within matrix avoiding for loops矩阵内的操作避免 for 循环
【发布时间】:2015-08-04 11:26:11
【问题描述】:

我有一个相当简单的问题,但我无法在 MATLAB 中得到正确的结果。

我正在 Matlab 中编写代码,其中有一个 200x3 矩阵。该数据对应于 10 个不同点的记录,每个点我拍摄了 20 帧。

这只是为了解释测量系统中的误差。所以现在我想通过计算测量的独立坐标的平均值来计算这个矩阵中每个点的 3D 坐标。

一个例子(1 个点,3 个测量值)是:

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,:)) 不使用循环结构?
  • 类似Des_col=1:20:200; Point=mean(MeasuredFrames(Des_col,:) ?
  • 是的,这就是我的目标!我尝试了很多类似的想法,但无法得到正确的结果......谢谢大家!

标签: matlab matrix vectorization


【解决方案1】:

如果您有图像处理工具箱,可以选择blockproc:

A = blockproc(data,[20 3],@(x) mean(x.data,1))

如果不是以下使用 permute 和 reshape 也可以:

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 函数只是工作!我真的很感谢你的帮助。太棒了!
  • arf ...我没有看到您在没有额外工具箱的情况下添加了解决方案。我的回答现在是多余的。虽然重塑的方式不同,但这本质上是相同的方法。
  • @Slash 我写错了,已更正,请重新检查。
  • 我现在正在看它,但我得到了正确的解决方案,在 (20, [ ], 3) 的块中重塑......无论如何,这些是我需要的功能,所以现在它只是一个玩玩的事。再次非常感谢! @thewaywewalk
  • @Slash 当然,10 分 à 20 个样本,我很困惑。请考虑接受其中一个答案以将问题标记为已解决。 (左侧的绿色复选标记)
【解决方案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 ) ; 

【讨论】:

    【解决方案3】:

    可以使用矩阵乘法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多