从多维数据中减去均值

Subtract mean from multi-dimensional data

我想对大量样本进行主成分分析。从音频样本中减去平均值没有问题,因为音频只有 2 个维度,我可以轻松使用 for 循环。

但是,对于视频来说情况不同,因为每个视频样本大约有 18-20 个维度。

一个视频文件的内容示例: whos -file sample_video_001.mat 结果:size: 54x96x19. bytes: 98496 . class: uint8. attributes: -

我该如何计算?

你可以使用强大的bsxfun来计算每个维度的平均值并直接从原始数组中减去它。

A = randi(256,54,96,19,'uint8');   %// Some random data, replace with your own
B = double(A);                     %// Cast data to double
Bav = bsxfun(@minus,B,mean(B,3));  %// Subtract the mean

结果比我最初想的要复杂一些,因为你有一个 'uint8' class 矩阵。沿第三个维度的数据的平均值很可能不是整数,因此将自动设置为 class 'double',直接设置为 bsxfun。如果您首先将原始数据转换为 'double',然后使用 bsxfun,它将起作用。可能您可能必须除以 256 才能获得 [0 1] 范围内的数据,以允许 MATLAB 将其识别为可绘图格式(B = double(A)./256; 也是如此)。您无法返回 'uint8',因为您从数据中减去非整数平均值,因此结果也不是整数。

有一个函数叫做 pca as well though, which is probably more suited to what you need, as it is a build-in function. Be sure that