【问题标题】:Matlab: How to write column number into new column if logical condition is metMatlab:如果满足逻辑条件,如何将列号写入新列
【发布时间】:2015-04-27 11:50:34
【问题描述】:

我在 matlab 中有一个这样的示例矩阵(尽管我的真实矩阵包含更多列)

List = [0,0,1;1,0,0;0,1,0;0,1,0;0,0,0]

List =

     0     0     1
     1     0     0
     0     1     0
     0     1     0
     0     0     0

我试图找到一种方法,我可以将 TRUE (=1) 的条件汇总到一个只有一列的新变量中,但这表示结构中的列号,例如以下列表

ListNew =

     3
     1
     2
     2
     0 

matlab 中是否有函数或简单的方法可以做到这一点?

【问题讨论】:

  • 那么,你可以连续有多个吗?如果是这样,输出会是什么样的?
  • 不,它只能包含一个真条件或不包含。如果指定 1,则应写出列名,如果整行包含 0,则应在新列中放置零

标签: matlab multiple-columns logical-operators


【解决方案1】:

find() 有一个更简单的方法

[ListNew,~] = find(List');

考虑到下面的评论,可以修改如下:

ListNew=zeros(5,1);
[Col,Row] = find(List');
ListNew(Rows)=Col;

【讨论】:

  • 这是一个很好的解决方案,谢谢。但是我也有一些不包含任何真实条件(全为零)的行,例如在这个矩阵List = [0,0,1;1,0,0;0,1,0;0,1,0;0,0,0] 中(对不起,我没有在我的 OP 中提到这一点,但对其进行了编辑)。如果我对这个新矩阵使用你的代码,第 0 行就会丢失。
【解决方案2】:

如果您的矩阵只有0s 和1s 并且每一行只有一个1,那么您可以这样做,

List = List .* repmat(1:size(List,2),size(List,1),1);
sum(List,2)
ans =
     3
     1
     2
     2
     3

【讨论】:

    【解决方案3】:

    sumcumsumfliplr 的单线解决方案 -

    out = sum(cumsum(fliplr(List),2),2)
    

    max 用于两行解决方案的另一种方法 -

    [idx,valid] = max(List,[],2)
    out = idx.*valid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多