在 Matlab 中交换 3*3*1 矩阵的两个元素



我有一个三维(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 列的值或为这种情况定义所需的行为。

最新更新