在MATLAB中格式化ANOVAN的矩阵数据

时间:2013-03-20 15:09:17

标签: matlab matrix

我有一个看起来有点像这样的数据矩阵,虽然要大得多(2000多行,30多列):

NaN   12   3   NaN   18   NaN   42   NaN    NaN   NaN   NaN...
68    NaN  14  Nan   NaN  NaN   NaN  NaN    NaN   NaN   26 ...
...

所以你看到它主要由NaN值组成。我自然感兴趣的是由值填充的单元格。

我希望能够在这个数据集上运行anovan,不幸的是它太大而无法手动重新格式化。我想要做的是让一个脚本贯穿矩阵,在矩阵中找到非NaN及其索引的每个值,并为anovan输入创建三个数组:

值= [12 3 18 42 68 14 26 ...]

行= [1 1 1 1 2 2 2 ...]

Columns = [2 3 5 7 1 3 11 ...]

行和列对应于研究中的评分者和评分者,这就是为什么保留每个值的确切索引对我来说非常重要的原因。

但我无法弄清楚如何做到这一点。

我尝试使用find,但无法让它做我想做的事。

[r c v] = find(~isnan(datamatrix)) %% doesn't work
编辑:我可以这样做:

[r c v] = find(datamatrix)

这将包括[r c v]输出中的所有NaN值。在那种情况下,我将如何通过V数组并删除NaN值及其相应的R和C值?

EDIT2:抓一点。我忘了我的一些值是0,所以我不能使用FIND命令。

1 个答案:

答案 0 :(得分:2)

您可以从数据矩阵中提取所有非NaN数字及其索引,如下所示:

i = find(~isnan(datamatrix)); 
values = datamatrix(i);
[rows,columns] = ind2sub(size(datamatrix),i);

对于您包含的示例数据,结果如下:

rows' = [2   1   1   2   1   1   2]
columns' = [ 1    2    3    3    5    7   11]
values' = [68   12    3   14   18   42   26]

这是所有指数及其所有相应的值。如果您需要以特定方式订购,则必须单独进行。