【问题标题】:How to copy over contents of an array/table based on the first column value in matlab?如何根据matlab中的第一列值复制数组/表的内容?
【发布时间】:2014-01-28 23:23:49
【问题描述】:

所以我有一个 matlab 单元格数组/表,第 1 列有用户名(十六进制),第 2 列有测试编号,第 2-5 列有数字形式的测试结果。基本上,我有超过 1500 个用户名,有些只出现一次,但其他可能出现多次。有什么方法可以在一行中获取 1 个用户的所有结果?

所以现在我有,例如(| = 新列):

J1o2h3n | 1 | 23 | 5.65466 | 3.5

J1o2h3n | 2 | 43 | 3.54444 | 2.1

00hexs  | 1 | 44 | 4.55333 | 4.5

S2a3m4  | 1 | 67 | 3.54444 | 2.1

S2a3m4  | 2 | 32 | 1.54788 | 4.3

我想将用户合并到 1 列中的数据:

J1o2h3n | 1 | 23 | 5.65466 | 3.5| 2 | 43 | 3.54444 | 2.1

00hexs  | 1 | 44 | 4.55333 | 4.5

S2a3m4  | 1 | 67 | 3.54444 | 2.1 | 2 | 32 | 1.54788 | 4.3

我尝试创建一个循环,该循环将根据用户名的相同性创建一个索引并水平复制行的内容,但无济于事:(

【问题讨论】:

    标签: matlab loops


    【解决方案1】:

    您可以使用unique 获取唯一名称值。然后你应该遍历这些行。要将最终输出中大小不等的数组内容分离到矩阵中,请使用padcat

    这是一个例子:

    usernames={'J1o2h3n','J1o2h3n','00hexs'}; %A cell array that contains the usernames
    results={'1', '3', '5.65', '3.5';'2','43','3.54444', '2.1';'1','44','4.5533', '4.5'}; %A cell array of the same length of the previous that contains an array with the results
    results = cellfun(@str2double,results);
    unique_names = unique(usernames);
    unique_results = cell(size(unique_names));
    
    for i=1:length(unique_names)
     name = unique_names{i};
     user_idxs = find(strcmp(usernames,name));
     for j=1:length(user_idxs)
      unique_results{i} = [unique_results{i} results(user_idxs(j),:)];
     end
    end
    
    unique_results = padcat(unique_results{:});
    

    【讨论】:

    • 非常感谢您的帮助!不幸的是,它告诉我:当我运行循环时,下标索引必须是真正的正整数或逻辑。我认为错误是因为您在循环中使用 0 作为索引,当我将其更改为 1 时它解决了问题。但是,这创建了一个 unique_results 数组,只有 1 列和数字 1-4,具体取决于用户的第二列。所以从上面的例子来看,它现在看起来像下面一样,除了那个......(对不起,我找不到你们如何用代码创建这些盒子......所以现在| =新行)12 | 1 |12
    • @Jay 检查新代码:您是否像示例一样生成usernamesresults 变量?
    • 所以数据实际上是列形式(参见第一个示例数据),而您的似乎是连续的。我转置了它,但没有解决任何问题。我认为您编码的示例结果可能是一个问题,即 1 个用户 = 1 个具有 4 个数据点的单元格,而我的是,如上例所示,1 = 4 个单元格,每个单元有 1 个数据点。
    • 澄清一下,我的数据看起来更像是这样输入的:usernames={'J1o2h3n';'J1o2h3n';'00hexs'};结果={1, 23, 5.65, 3.5;2, 43, 3.54444 , 2.1;1 ,44 ,4.5533 ,4.5};
    • @Jay 我现在无法测试代码,但您可以更改代码并将其适应您的输入数据...例如,您可以替换最后一行添加:unique_results{i} = [unique_results{i} results{user_idxs(j),:}];
    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多