我有一个matrix A
,它的大小是40*20*20 double
。matrix A
的最小值为0
。"matrix A
"最大值为"126
"。我想将matrix A
中的所有非零值设置为"1"
.我使用以下命令,但它不起作用。
find(A(:,:,:)~= 0) = 1;
谁能告诉我为什么?
使用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。这要归功于拉斐尔·蒙泰罗最初提出的选角想法。请看他的回答:https://stackoverflow.com/a/32803092/3250829。我还决定使用uplus
操作符来不同。一口>
如果0仍然是0,其他所有东西都变为1,则存在不需要索引也不需要查找。你可以这样做:
A = A ~= 0;
但是,它将创建一个逻辑矩阵。如果有为双精度,只需将其强制转换为双精度,如下所示:
A = double(A ~= 0);
如文档所述(http://de.mathworks.com/help/matlab/ref/find.html), find函数只返回满足您作为find()函数参数提供的条件的元素的索引。因此,您尝试将1赋值给find()的返回参数是不能工作的。
我建议您不要使用find函数,而是循环遍历数组内容并逐个检查每个元素。结合size函数(http://de.mathworks.com/help/matlab/ref/size.html),您可以创建一个大小无关的函数来更改数组。只需存储size()的返回值并将其用作循环索引。
find
返回索引,因此如果您想访问这些值,则必须执行A(find(A)) = 1;
。注意,默认情况下,find
查找非零值的索引:http://ch.mathworks.com/help/matlab/ref/find.html