Matlab:如果满足逻辑条件,如何将列号写入新列
Matlab: How to write column number into new column if logical condition is met
我在 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 中执行此操作的函数或简单方法?
如果你的矩阵只有 0
s 和 1
s 并且每一行只有一个 1
那么你可以这样做,
List = List .* repmat(1:size(List,2),size(List,1),1);
sum(List,2)
ans =
3
1
2
2
3
find()
有一个更简单的方法
[ListNew,~] = find(List');
考虑到下面的注释可以修改如下:
ListNew=zeros(5,1);
[Col,Row] = find(List');
ListNew(Rows)=Col;
具有 sum
、cumsum
和 fliplr
-
的单行解决方案
out = sum(cumsum(fliplr(List),2),2)
另一种方法 max
用于两行解决方案 -
[idx,valid] = max(List,[],2)
out = idx.*valid
我在 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 中执行此操作的函数或简单方法?
如果你的矩阵只有 0
s 和 1
s 并且每一行只有一个 1
那么你可以这样做,
List = List .* repmat(1:size(List,2),size(List,1),1);
sum(List,2)
ans =
3
1
2
2
3
find()
[ListNew,~] = find(List');
考虑到下面的注释可以修改如下:
ListNew=zeros(5,1);
[Col,Row] = find(List');
ListNew(Rows)=Col;
具有 sum
、cumsum
和 fliplr
-
out = sum(cumsum(fliplr(List),2),2)
另一种方法 max
用于两行解决方案 -
[idx,valid] = max(List,[],2)
out = idx.*valid