我想对大量样本进行主成分分析。我没有问题从音频样本中减去均值,因为音频只有2个维度,我可以轻松地使用for
循环。
然而,这是视频的另一种情况,因为每个视频样本都有大约18-20个维度。
一个视频文件的内容示例:
whos -file sample_video_001.mat
结果:size: 54x96x19. bytes: 98496 . class: uint8. attributes: -
我该如何计算?
答案 0 :(得分:4)
您可以使用强大的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'
类矩阵。您在第三维度上的数据平均值最有可能不是整数,因此会自动设置为类'double'
,而导致bsxfun
失败。如果您先将原始数据转换为'double'
,然后使用bsxfun
,则可以使用。可能您可能需要除以256以获取[0 1]
范围内的数据,以允许MATLAB将其识别为可绘图格式(B = double(A)./256;
也是如此)。你不能回到'uint8'
,因为你从数据中减去一个非整数均值,所以结果也不是整数。
虽然有一个名为pca
的函数,它可能更适合您需要的函数,因为它是一个内置函数。请确保you know how to use it properly。