0

我知道有命令

    A(:, find(sum(abs(A)) == 1)) = []

这将找到总和等于 1 的列,然后将其删除。这不是我要找的,因为如果一行包含 2 和 -1 它将删除该行。但我试图找到一个包含全零和一个 1 的列,然后该命令会将那个 1 设置为零。

任何帮助将不胜感激。

EX:一列零

    [1 2 3
     0 3 2
     0 1 2]

我希望将第一列更改为一列零

4

4 回答 4

1

试试这个:

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
于 2013-10-31T19:43:15.750 回答
0

您需要合并这两个条件:

idx = find ((sum(a==1)==1));
idx2 = find ((sum(abs(a)) == 1));

第一个搜索只有一个数字“1”的列。第二次搜索绝对和仅为 1 的列,所以 2,-1,-1,1 没问题!

于 2013-10-31T20:00:29.997 回答
0

您快到了。只需要分配0而不是删除使用[]

A(:, find(sum(abs(A)) == 1)) = 0
于 2013-10-31T20:06:21.653 回答
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
于 2013-10-31T20:59:58.697 回答