在分配期间编制索引

时间:2012-11-29 01:45:47

标签: matlab indexing octave

说我有这个样本数据

A =
1.0000     6.0000   180.0000    12.0000
1.0000     5.9200   190.0000    11.0000
1.0000     5.5800   170.0000    12.0000
1.0000     5.9200   165.0000    10.0000
2.0000     5.0000   100.0000     6.0000
2.0000     5.5000   150.0000     8.0000
2.0000     5.4200   130.0000     7.0000
2.0000     5.7500   150.0000     9.0000

我希望计算每列的方差,按类(第一列)分组。

我使用以下代码,但它使用硬编码索引,需要了解每个类的样本数,并且它们必须按特定顺序排列。

有更好的方法吗?

variances = zeros(2,4);
variances = [1.0 var(A(1:4,2)), var(A(1:4,3)), var(A(1:4,4));
             2.0 var(A(5:8,2)), var(A(5:8,3)), var(A(5:8,4))];

disp(variances);

1.0 3.5033e-02   1.2292e+02   9.1667e-01
2.0 9.7225e-02   5.5833e+02   1.6667e+00

3 个答案:

答案 0 :(得分:5)

将类标签和数据分成不同的变量。

cls = A(:, 1);
data = A(:, 2:end);

获取班级标签列表

labels = unique(cls);

计算方差

variances = zeros(length(labels), 3);
for i = 1:length(labels)
  variances(i, :) = var(data(cls == labels(i), :)); % note the use of logical indexing
end

答案 1 :(得分:2)

这些年来我已经完成了很多类型的工作,但是为了能够判断,更好地与最好的相比,它将有助于了解您希望在数据集或结构中发生什么变化。

否则,如果预计没有变化且硬编码有效,请坚持使用。

答案 2 :(得分:0)

轻松,轻松。使用consolidator。它在文件交换中。

A = [1.0000     6.0000   180.0000    12.0000
1.0000     5.9200   190.0000    11.0000
1.0000     5.5800   170.0000    12.0000
1.0000     5.9200   165.0000    10.0000
2.0000     5.0000   100.0000     6.0000
2.0000     5.5000   150.0000     8.0000
2.0000     5.4200   130.0000     7.0000
2.0000     5.7500   150.0000     9.0000];

[C1,var234] = consolidator(A(:,1),A(:,2:4),@var)
C1 =
     1
     2
var234 =
     0.035033       122.92      0.91667
     0.097225       558.33       1.6667

我们可以测试产生的差异,因为我们知道分组。

var(A(1:4,2:4))
ans =
     0.035033       122.92      0.91667

var(A(5:8,2:4))
ans =
     0.097225       558.33       1.6667

它也很有效。