代码之家  ›  专栏  ›  技术社区  ›  csg techguy18985

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

  •  0
  • csg techguy18985  · 技术社区  · 7 年前

    我有一个三维(3*3*1)矩阵,当我尝试用它旁边的元素中的一个交换0时(例如,右边的元素),它交换了两个元素,但所有其他元素都变成了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
    

    然而,当我用一个2维(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
    

    为什么会出现这种情况,我该如何解决?谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Sardar Usama    7 年前

    3*3*1 不是三维矩阵。它是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 将使前9个元素 a 为零(如果 以前工作区中不存在)。


    您的代码还有一个问题,即如果第三列中存在零,那么您的代码会尝试用第四列中的相应值替换它 这根本不存在 因此,您将获得:

    索引超出了矩阵维度。

    因此,您需要放弃第3列的值,或者为这种情况定义所需的行为。