我知道有命令
A(:, find(sum(abs(A)) == 1)) = []
这将找到总和等于 1 的列,然后将其删除。这不是我要找的,因为如果一行包含 2 和 -1 它将删除该行。但我试图找到一个包含全零和一个 1 的列,然后该命令会将那个 1 设置为零。
任何帮助将不胜感激。
EX:一列零
[1 2 3
0 3 2
0 1 2]
我希望将第一列更改为一列零
试试这个:
sum(a)==1 & sum(a==1) & ~sum(a>1) & ~sum(a<0)
第一个语句在列总和为 1 时
为真第二个在至少有一个 1
时为真第三个在没有大于 1
的数字时为真第四个在没有小于 0 的数字时为真
因此,只有 1 和 0 加起来为 1
最终结果将是一个由 1 和 0 组成的向量(1==true,0=false)
要将列中的单个 1 更改为 0,请执行以下操作:
a(:,sum(a)==1 & sum(a==1) & ~sum(a>1) & ~sum(a<0))=0
您需要合并这两个条件:
idx = find ((sum(a==1)==1));
idx2 = find ((sum(abs(a)) == 1));
第一个搜索只有一个数字“1”的列。第二次搜索绝对和仅为 1 的列,所以 2,-1,-1,1 没问题!
您快到了。只需要分配0
而不是删除使用[]
A(:, find(sum(abs(A)) == 1)) = 0
一个更简单的表达式是:
A(:, sum(A==1)==1 & sum(abs(A))==1) = 0;
解释:
A==1 - returns a boolean array with 1's where A==1, 0's everywhere else
sum(A==1) - sums over the first dimension of the boolean array: will ==1 where there is exactly one 1
sum(abs(A)) - when there is exactly one 1, this sum will ==1 only if the rest are zero