繁体   English   中英

在 Matlab 中构造一个矩阵,跟踪每行中的相等元素

[英]Construct a matrix in Matlab that keeps track of equal elements in each row

假设我在 Matlab 中有一个IxJ矩阵A ,其中包含一些数字(可能包括Inf-Inf

例如,对于I=3J=5 ,我可以有

A=  [0    0      0 Inf -Inf; 
     5    4      0 Inf -Inf;
     Inf -Inf    0 0   0];

我想构造一个大小为IxJ的矩阵B ,这样每一行i1开始,并且每次A(i,:)的元素发生变化时都添加一个+1 在上面的例子中

B=  [1 1 1 2 3;  %
     1 2 3 4 5;
     1 2 3 3 3];

你能建议如何进行吗?

使用diffcumsum很容易做到这一点。

如果连续的infinf值应计为不同

B = cumsum([true(size(A,1),1) diff(A,[],2)~=0], 2);

它的工作原理如下:

  • diff(A,[],2)沿每一行取连续的差异;
  • ~=0将非零值转换为1
  • [true(size(A,1),1)...]在前面添加一列true值;
  • cumsum(..., 2)沿每一行累积值。

这将inf值视为不同,因为inf-infdiff([inf inf]给出NaN而不是0

如果连续的inf-inf值应分别计为相等

只需将diff(...)~=0替换为仅涉及索引和~=的表达式:

B = cumsum([true(size(A,1),1) A(:,1:end-1)~=A(:,2:end)], 2);

这将inf值视为相等,因为inf==inf给出true ,或者等效地inf~=inf给出false ,对于-inf也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM