如何在MATLAB中将矩阵中的所有非零值设置为1?

时间:2015-09-26 22:45:56

标签: matlab matrix

我有matrix A,其大小为40*20*20 doublematrix A的最小值为0matrix A的最大值为126。我想将matrix A中的所有非零值设置为"1"。我使用以下命令,但它不起作用。

find(A(:,:,:)~= 0) = 1; 

谁能告诉我为什么?

4 个答案:

答案 0 :(得分:4)

使用logical索引进行操作。不要使用find

A(A ~= 0) = 1;

但是,如果您希望用0或1替换矩阵中的所有值,其中1是非零,您可以简单地创建logical矩阵,如下所示:

A = A ~= 0;

如果您希望将此作为double矩阵,则可以通过uplus(一元加号)运算符轻松执行此操作,或者转换为double 1功能

A = +(A ~= 0);
%// or
%A = double(A);

1。对于最初提出铸造想法,归功于Rafael Monteiro。在这里查看他的回答:https://stackoverflow.com/a/32803092/3250829。我还决定使用uplus运算符来区别。

答案 1 :(得分:2)

如果零将保留为零,其他所有内容将变为1,则存在 无需索引也无需查找。你可以这样做:

A = A ~= 0;

但是,它会创建一个逻辑矩阵。如果 为双倍,只需将其加倍,如下所示:

A = double(A ~= 0);

答案 2 :(得分:1)

当文档声明(http://de.mathworks.com/help/matlab/ref/find.html)时,find函数只返回满足您作为find()的函数参数给出的条件的元素的索引。因此,尝试将1分配给find()的返回参数不起作用。

我建议你循环遍历数组内容并单独检查每个元素,而不是使用find函数。结合大小函数(http://de.mathworks.com/help/matlab/ref/size.html),您可以创建一个与大小无关的函数来更改数组。只需存储size()的返回值,并将它们用作循环索引。

答案 3 :(得分:0)

find返回索引,因此如果要访问这些值,则必须执行A(find(A)) = 1;。请注意,find默认情况下会找到非零值的索引:http://ch.mathworks.com/help/matlab/ref/find.html