【问题标题】:How to apply a complex function to every row of a .csv file in MATLAB?如何将复杂函数应用于 MATLAB 中 .csv 文件的每一行?
【发布时间】:2022-01-02 17:18:28
【问题描述】:

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

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

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

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 例如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 行与其他行没有区别,并且不包含任何特殊字符或值。我不知道他们有什么问题。

【问题讨论】:

  • SO 不是免费的编码服务。请尝试自己解决问题。首先将其分解为一组较小的问题
  • 您提到尝试一些解决方案。在此处展示您的尝试,包括所有错误详细信息。更多建议请参见How to Ask
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: function matlab rows chaos


【解决方案1】:

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 的哪一行导致了错误。

【讨论】:

  • 感谢您的澄清!不幸的是,它没有用。
猜你喜欢
  • 2018-10-31
  • 2011-01-19
  • 2013-02-23
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2017-07-01
相关资源
最近更新 更多