我有一个看起来有点像这样的数据矩阵,虽然要大得多(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命令。
答案 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]
这是所有指数及其所有相应的值。如果您需要以特定方式订购,则必须单独进行。