对多变量数据进行分类并给出新的坐标

时间:2015-11-06 13:46:11

标签: matlab vector coordinates

考虑以下数据集

 Obs y x z
 1   3 10 1  
 2   0 12-1
 3   4  9 3
 4   2 15 0

y是因变量,其他是解释变量

我想根据一些条件给出总共4个观测值的新坐标,例如,

如果y在[0,3]中给那个y 1, 或者如果y在[3,6]中,则给那个y加2。

同样地, 如果x在[9,12]中,给那个x加1, 或者如果x在[12,16]中,给那个x赋予2,

为z做类似的事。

结果,

Obs     y   x   z   coordinate

1       3   10  1   (1,1,1) 
2       0   12  1   (1,1,1)
3       4   9   3   (2,1,2)
4       2   15  0   (1,2,1)

我需要这些新坐标作为4次观测的矢量。

我或许可以通过“循环”来做到这一点。命令,但太耗时了。 所以我需要在没有“循环”的情况下做到这一点。但是有一些与矢量相关的命令。

有人知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

您可以使用逻辑索引轻松完成此操作,事实上,这在这里得到了很好的回答:Change elements of matrix based on condition

n=4;
coordinate = zeros(n,3);
%// y
coordinate(:,1) = (y > 3) + 1

%// x
coordinate(:,2) = (x > 12) + 1

等...

答案 1 :(得分:0)

如果基于逻辑表达式每个坐标只有两个值,Dan's answer会很好用,如果你有更复杂的逻辑要求,那么我认为你想要类似下面的东西(很容易就是这样)扩展到涵盖更多案例):

y = [ 3   0   4   2  ]';
x = [ 10  12  9   15 ]';
z = [ 1   1   3   0  ]';

coordinate = zeros(length(x), 3);

coordinate(y >= 0 & y < 3, 1) = 1;
coordinate(y >= 3 & y < 6, 1) = 2;

coordinate(x >= 9 & x < 12, 2) = 1;
coordinate(x >= 12 & x < 16, 2) = 2;

coordinate(z >= 0 & z < 3, 3) = 1;
coordinate(z >= 3 & z < 6, 3) = 2;

coordinate

结果

coordinate =

     2     1     1
     1     2     1
     2     1     2
     1     2     1

您可以在其中读取每一行,例如coordinate(1, :)以获取第一组坐标。

这样做的另一个好处是,您可以看到没有任何规则匹配,因为coordinate矩阵中的元素将为0。您也可以使用nan代替zeros来创建coordinate矩阵。