【问题标题】:Find the index of the last non-zero element in each row of a given matrix?查找给定矩阵每一行中最后一个非零元素的索引?
【发布时间】:2010-10-11 22:02:02
【问题描述】:

对于任意大小的矩阵x,如何找到给定矩阵每一行中最后一个非零元素的索引?

例如对于矩阵

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ]

应该得到向量[ 3 6 0 5 ]

【问题讨论】:

  • 这不会是家庭作业吧?
  • 这对我来说有点像家庭作业......
  • 是的,但这是一个有趣的问题。
  • 我知道我见过类似的问题(在我最喜欢的列表中):stackoverflow.com/questions/831721/…

标签: arrays matlab matrix


【解决方案1】:

这是一个较短的版本,结合了findaccumarray

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ];
%# get the row and column indices for x
[rowIdx,colIdx] = find(x);
%# with accumarray take the maximum column index for every row
v = accumarray(rowIdx,colIdx,[],@max)'
v =
     3   6   0   5

【讨论】:

  • 不错的 accumarray 用法,我会尽量记住它。 +1
【解决方案2】:

这是一个版本:

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ];
c = arrayfun(@(k) find(x(k,:)~=0,1,'last'), 1:size(x,1), 'UniformOutput',false);
c( cellfun(@isempty,c) ) = {0};
v = cell2mat(c);

v =
     3     6     0     5

编辑: 考虑这个替代解决方案:

[m,v] = max( cumsum(x'~=0) );
v(m==0) = 0;

v =
     3     6     0     5

【讨论】:

  • 你可能会使用 CUMSUM 和 DIFF 组合编写一个更好的矢量化解决方案。让我们看看我是否能找到一个:)
  • @Jack Lu:如果您发现有用的解决方案,请考虑支持/接受它。
  • '~= 是什么意思? x 的转置,然后检查每个单元格不等于 0 的点?
  • @hhh: ~= 是元素不等式运算符。转置在这里只是一个细节,我们可以明确指定工作的维度:[m,v] = max(cumsum(x~=0,2),[],2)。下一行处理一行全为零的情况
【解决方案3】:

bsxfun 的一条线解决方案:

result = max(bsxfun(@times, x~=0, 1:size(x,2)).');

或者使用max的两个输出:

[val, result] = max(fliplr(x~=0).',[],1); %'
result = (size(A,2)+1-result).*val;

【讨论】:

    【解决方案4】:

    我的回答有点扭曲,但应该也可以

    x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ];
    [~,pos] = max([fliplr(x~=0),ones(size(x,1))],[],2);
    v = size(x,2)-pos' +1;
    

    【讨论】:

    • 正确,剪切和粘贴错误,现已修复。
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多