【问题标题】:Finding indices of non-zero elements in Matlab matrix在 Matlab 矩阵中查找非零元素的索引
【发布时间】:2014-04-30 04:16:03
【问题描述】:

我有一个像

这样的矩阵
A = [ 0 1 1;0 0 0;1 1 0]

为此,我希望了解1 的索引,方式如下:

对于第 1 行,我需要等于 1 的列的索引值。第 2 行和第 3 行也是如此。

稍后,我想对列重复此练习,例如对于第 1 列,我需要行的索引值等于 1。第 2 列和第 3 列也是如此。

ans 应该是这样的:

  • 对于第 1 行 - 索引是:2,3
  • 对于第 2 行 - 索引为:0
  • 对于第 3 行 - 索引是:1,2

同样:

  • 对于第 1 列 - 索引是:3
  • 对于第 2 列 - 索引为:1,3
  • 对于第 3 列 - 索引为:1

请帮忙。

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    使用findaccumarray

    [ii jj] = find(A); %// find row and col indices (ii and jj respectively)
    rows = accumarray(ii,jj,[], @(v) {sort(v).'}); %'// group jj as per ii, and sort
    cols = accumarray(jj,ii,[], @(v) {sort(v).'}); %'// group ii as per jj, and sort
    

    对于您的示例,这给出了

    >> rows{:}
    ans =
         2     3
    ans =
         []
    ans =
         1     2
    >> cols{:}
    ans =
         3
    ans =
         1     3
    ans =
         1
    

    如果您确实需要使用0 填充空结果:

    rows = accumarray(ii,jj,[], @(v) {sort(v).'}, {0}); %'// 5th input is fill value
    cols = accumarray(jj,ii,[], @(v) {sort(v).'}, {0});
    

    导致

    >> rows{:}
    ans =
         2     3
    ans =
         0
    ans =
         1     2
    >> cols{:}
    ans =
         3
    ans =
         1     3
    ans =
         1
    

    【讨论】:

    • 现在就像这样,我们在各自的数组中有两组行和列都有 1,我们如何找到相应的行和列数组的交点。就像 ans 需要的那样:>>3,>> [],>>1。我正在尝试使用 intersect 命令,但结果是“输入参数过多”。好吧,如果为所有相应的行和列数组找到了交集,我只需要根据具有最大最大交点的最小元素对它们进行排名。你能推荐一些东西吗?
    • @NeerajBhanot arrayfun(@(k) intersect(rows{k}, cols{k}), 1:numel(rows), 'uni', 0)
    • 这是完整的问题,先生:
    • 请查看下面我发布的完整问题的链接:stackoverflow.com/questions/22591831/…
    • 我喜欢accumarray,+1;太糟糕了,它需要sort,因为第一个输入没有排序。我希望它能够自动处理。
    【解决方案2】:

    最简单的方法可能是使用循环和find 函数与元胞数组相结合来存储您的答案。例如,要获取每行中的列表:

    for i=1:size(A,1)
        rowsOne{i} = find(A(i,:)==1);
    end
    

    rowsOne{i} 然后包含一个向量,列出数组 A 的第 i 行中等于 1 的元素的索引。如果一行中没有等于 1 的元素,它将保存一个空数组。

    列的解决方案大致相同。

    【讨论】:

    • 根据经验,您应该远离 MatLab 中的 for 循环。它们非常慢,而且几乎总是有一个内置函数可以在一个简洁的快速执行表达式中完成您需要的操作。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2013-01-03
    • 2015-05-13
    • 2013-09-13
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多