0

我想从 Toker 等人的论文中应用一个具有特定功能 ( chaos; https://figshare.com/s/80891dfb34c6ee9c8b34 ) 的外部代码。2020 ( https://www.nature.com/articles/s42003-019-0715-9#Sec1 ) 以测试我的数据是随机的还是混乱的。

我尝试了循环 for , cellfun,但在这种情况下这些都不起作用。

当我尝试使用以下代码时:

T = readtable('ibfrq3.csv');
C = table2array(T);
D = num2cell(C, 2);
rowSums = cellfun(@sum, D)
chaos = cellfun(@chaos, D)

我收到三个错误:

Unable to perform assignment because the size of the left side is 1-by-14 and the size of the right side is
1-by-3.

Error in chaos>surrogate (line 989)
        surr(k,:)=unwrap(horzcat(st,parts{randperm(j)},en));

Error in chaos (line 157)
            [surr, params] = surrogate(zscore(surr_y), num_surr, 'CPP', 1, 1); 

有趣的是,我能够使该功能起作用,但仅适用于单独的行(通过将它们复制到方括号中并标记为 y eg y = [1,2,3,4,5,6,7,8,9,5,6,7,8,8])。

我想要的输出是带有chaos函数输出的字符串(或者理想情况下是添加到我的 .csv 的列)(每行一个单词:“随机”或“混乱”,具体取决于结果)。

我的数据可在此处获得:https ://drive.google.com/file/d/1I2BChrv0iqNr1dcEKTQKxKF7DDl_hF23/view?usp= sharing .csv 包含不同时间段的等位基因频率。

编辑:尝试

numRows = size(C, 1);
for row = 1:numRows
    result(row) = chaos(C(row,:));
end

产生与上述类似的错误。

我还尝试在我的数据上逐行运行代码以检查哪一行导致使用问题

row1 = C(1,:);
chaos(row1)

对于每一行。有趣的是,它可以完美地为第 1、3-9、11-100 行提供所需的输出。第 2 行和第 10 行与其他行没有区别,并且不包含任何特殊字符或值。我不知道他们有什么问题。

4

1 回答 1

0

cellfun(及其近亲arrayfun)在这里不适合,因为它们分别将函数应用于数组的每个元素,而您想将函数应用于每一行。此外,您分配的值chaos已经是函数的名称,这可能会导致令人困惑的行为。

如果C是一个m x n数值数组,并且chaos是一个将行向量作为输入并返回一个标量值作为输出的函数,则

numRows = size(C, 1);
for row = 1:numRows
    result(row) = chaos(C(row,:));
end

将创建一个 1 x m向量result,其中包含函数的每一行的输出C

如果chaos函数返回字符向量,则需要将结果存储在元胞数组中,方法是将循环内的行更改为

result{row} = chaos(C(row,:));

但是,您添加到问题中的错误消息表明还有另一个问题,因为它告诉我们chaos函数内部的操作失败。如果你说chaos当你一次给它一行数据时它似乎工作正常,那么你的数组C不包含你认为它所做的,或者有一行数据导致它由于某种原因而失败。您需要对此进行调试。首先,您可以在循环内添加一个disp(row),它将显示哪一行C导致错误。

于 2022-01-05T10:01:50.097 回答