我有matrix A
,其大小为40*20*20 double
。 matrix A
的最小值为0
。 matrix A
的最大值为126
。我想将matrix A
中的所有非零值设置为"1"
。我使用以下命令,但它不起作用。
find(A(:,:,:)~= 0) = 1;
谁能告诉我为什么?
答案 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