我有一个三维(3*3*1)矩阵,当我尝试将0与旁边的元素(例如右侧的元素)的on交换时,它会交换两个元素,但不知何故,所有其他元素都变为0(如结果1所示)。
clear all
clc
count=1;
node=[4,0,3;7,5,6;8,1,2];
[m,n,~]=find(~node);
node(m,n,count+1)=node(m,n+1,count);
node(m,n+1,count+1)=0;
count=count+1;
disp(node(:,:,count))
结果 1:
0 3 0
0 0 0
0 0 0
但是,当我用二维 (3*3) 矩阵尝试同样的事情时,结果是我预期的(如结果 2所示)。
clear all
clc
count=1;
node=[4,0,3;7,5,6;8,1,2];
[m,n,~]=find(~node);
node(m,n)=node(m,n+1,count);
node(m,n+1)=0;
count=count+1;
disp(node)
结果 2:
4 3 0
7 5 6
8 1 2
为什么会这样,我该如何解决?谢谢。
3*3*1
不是3D矩阵。它是2D的。3*3*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*
也是2D的。任何矩阵都有无限的单例更高维度。
使用此行node(m,n,count+1)=node(m,n+1,count);
,您可以将其更改为 3D。node(m,n+1,count);
等于3
m=1 (1st row), n=2+1=3 (3rd column), and count=1 (1st 3D slice)
你把它保存在node(m,n,count+1)
m=1 (1st row), n=2 (2nd column), count+1=2 (2nd 3D slice)
但您仅显示第二个 3D 切片count=count+1; disp(node(:,:,count))
请注意,count
等于现在的2
。
其余元素初始化为零是默认行为。 例如a(10) = 9
将使a
的第一个 9 个元素为零(如果之前工作区中不存在a
)。
您的代码还有一个问题,那就是如果第三列中存在零,那么您的代码会尝试将其替换为不存在的第4 列中的相应值,因此您将获得:
索引超过矩阵维度。
因此,您需要丢弃第 3 列的值或为这种情况定义所需的行为。