我有两个不同的文件,其中一个是输入矩阵(X),它有3823*63个元素(3823个输入和63个特征),另一个是类别向量(R),它有3823*1个元素;这些元素的值从0到9(共有10个类别)。
我需要为每个类别计算协方差矩阵。到目前为止,我只能通过许多嵌套循环为每个类别计算均值向量。然而,这让我头脑一片空白。
有没有其他更简单的方法?
这是我目的的代码(感谢Sam Roberts):
xTra = importdata('optdigits.tra');xTra = xTra(:,2:64); % 第一列的输入都是零rTra = importdata('optdigits.tra');rTra = rTra(:,65); % 数据的类别c = numel(unique(rTra));for i = 1:c rTrai = (rTra==i-1); % 获取第i个类别的元素索引 meanvect{i} = mean(xTra(rTrai,:)); % 计算它们的均值 covmat{i} = cov(xTra(rTrai,:)); % 计算它们的协方差end
回答:
这是否符合你的需求?
X = rand(3263,63);R = randi(10,3263,1)-1;numClasses = numel(unique(R));for i = 1:numClasses Ri = (R==i); % 获取第i个类别的元素索引 meanvect{i} = mean(X(Ri,:)); % 计算它们的均值 covmat{i} = cov(X(Ri,:)); % 计算它们的协方差end
这段代码循环遍历每个类别,选择R中对应于该类别观测值的行,然后从X中获取相同的行并计算它们的均值和协方差。结果存储在一个单元数组中,因此你可以这样访问结果:
% 显示第1类的均值向量meanvect{1}% 显示第2类的协方差矩阵covmat{2}
希望这对你有帮助!