Matlab 为什么矩阵大小不同?

Matlab 为什么矩阵大小不同?,matlab,Matlab,我有一个0/1值矩阵magnity和另一个矩阵edgels。两者都是450x450双精度的。我只想将与magnity中的1值相对应的单元格保留在edgels中,并将其余单元格归零。我正在尝试以下操作: edgels(magnitude==1)=edgels; 我得到一个错误: 在赋值A(:)=B中,A和B中的元素数必须相同 为什么它们大小不一样 最好的方法是什么 之所以会出现这种错误,是因为幅值==1为您提供了0/1的二进制掩码,并且通过逻辑索引,幅值==1中的非零值总数必须与分配给边格的元

我有一个
0
/
1
值矩阵
magnity
和另一个矩阵
edgels
。两者都是450x450双精度的。我只想将与
magnity
中的
1
值相对应的单元格保留在edgels中,并将其余单元格归零。我正在尝试以下操作:

edgels(magnitude==1)=edgels;
我得到一个错误:

在赋值A(:)=B中,A和B中的元素数必须相同

  • 为什么它们大小不一样
  • 最好的方法是什么

之所以会出现这种错误,是因为
幅值==1
为您提供了0/1的二进制掩码,并且通过逻辑索引,
幅值==1
中的非零值总数必须与分配给
边格的元素总数相匹配,但实际情况并非如此

执行您要求的操作的最简单方法是在
edgels
中查找幅值为1或0的所有值,然后将这些值设置为0

edgels(magnitude == 0) = 0;
但是,如果您想使用您的逻辑,您应该首先创建一个零矩阵,然后修改输出中相应位置的
幅值==1

out = zeros(size(edgels));
out(magnitude == 1) = edgels(magnitude == 1);
注意左右两侧。需要复制的元素总数相同

我可以提供的另一种选择是简单地将
magnity
edgels
元素相乘,如果
magnity
中的某个元素等于0,则相乘结果为0,否则不进行处理:

out = edgels .* double(magnitude);

请注意,您需要将
magnity
转换为与
edgels
相同的类型,以使乘法正常工作,否则MATLAB将在乘法不同类型的矩阵时给您一个错误。

您会得到这个错误,因为
magnity==1
通过逻辑索引为您提供了一个0/1的二进制掩码,
magnity==1
中非零值的总数必须与分配给
edgels
的元素总数相匹配,但实际情况并非如此

执行您要求的操作的最简单方法是在
edgels
中查找幅值为1或0的所有值,然后将这些值设置为0

edgels(magnitude == 0) = 0;
但是,如果您想使用您的逻辑,您应该首先创建一个零矩阵,然后修改输出中相应位置的
幅值==1

out = zeros(size(edgels));
out(magnitude == 1) = edgels(magnitude == 1);
注意左右两侧。需要复制的元素总数相同

我可以提供的另一种选择是简单地将
magnity
edgels
元素相乘,如果
magnity
中的某个元素等于0,则相乘结果为0,否则不进行处理:

out = edgels .* double(magnitude);

请注意,您需要将
magnity
转换为与
edgels
相同的类型,以使乘法正常工作,否则MATLAB将在乘法不同类型的矩阵时出错。

其他非1的值如何?这些应该设置为什么?您还得到了这个错误,因为
幅值==1
给您一个0/1的二进制掩码,并且通过逻辑索引,
幅值==1
中的非零值总数必须与分配给
edgels
的元素总数相匹配,事实并非如此。@rayryeng抱歉。请参见编辑。
edgels(幅值==1)
numel
项等于
1
,而
edgels
是完整矩阵。其他非1的值呢?这些应该设置为什么?您还得到了这个错误,因为
幅值==1
给您一个0/1的二进制掩码,并且通过逻辑索引,
幅值==1
中的非零值总数必须与分配给
edgels
的元素总数相匹配,事实并非如此。@rayryeng抱歉。请参见编辑。
edgels(幅值==1)
具有等于
1
的条目的
numel
,而
edgels
是完整矩阵。