从多维数据中减去均值
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 。
我想对大量样本进行主成分分析。从音频样本中减去平均值没有问题,因为音频只有 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