是否有一种方法可以以更简单的方式将MATLAB中的多个2x2矩阵堆叠到多维数组中(例如,不使用“cat”或“重塑”)?

是否有一种方法可以以更简单的方式将MATLAB中的多个2x2矩阵堆叠到多维数组中(例如,不使用“cat”或“重塑”)?,matlab,matrix,multidimensional-array,formatting,reformatting,Matlab,Matrix,Multidimensional Array,Formatting,Reformatting,我每天从某人那里收到一个文本文件,其中包含1000个大小为2x2的矩阵,格式如下(此处仅显示3个矩阵,而不是1000个): 我需要在MATLAB中制作一个2x2x1000数组理想情况下我可以做一些简单的事情,比如: [0.96875000 0.03125000 0.03125000 0.96875000; 0.96875000 0.01562500 0.03125000 0.98437500; 0.99218800 0.03125000 0.00781250 0.96875000]

我每天从某人那里收到一个文本文件,其中包含1000个大小为2x2的矩阵,格式如下(此处仅显示3个矩阵,而不是1000个):

我需要在MATLAB中制作一个2x2x1000数组理想情况下我可以做一些简单的事情,比如:

[0.96875000 0.03125000 
0.03125000 0.96875000;

0.96875000 0.01562500 
0.03125000 0.98437500;

0.99218800 0.03125000 
0.00781250 0.96875000]
在阅读和之后,我发现我可以通过以下方式生成所需的数组(cat的第一个参数是
3
,因为我将2x2矩阵沿第三维连接起来):

但是,如果我像上面的“理想”示例那样在两行之间设置间距,那么这就行不通了,而且需要所有的逗号和点,在我看来,这就有点难看了

在写这个问题时,我发现我可以运行我的“理想”示例,然后使用
重塑
,这比使用
cat
函数的解决方案更可取。对于这个,我甚至不需要分号。然而,
重塑
是不够的,还需要
置换
,然后解决方案就不那么简单了:

permute(reshape(ideal.',2,2,[]),[2 1 3])
我们要做的是移除转置,但解决方案仍然相当复杂,不容易设计:

permute(reshape(ideal,2,[],2),[1 3 2])
理想情况下,不需要使用
cat
重塑
来制作3D阵列,因为原始数据的格式已经非常好,人眼已经可以看到的是由几个2x2矩阵组成的3D阵列

是否有一种更简单的方法可以使用我所拥有的格式的数据在MATLAB中构建3D阵列?

到目前为止,我已经独立完成了以下工作:

  • 在线搜索并找到上述两篇MATLAB文档文章,这两篇文章引导我使用
    cat
  • 在编写此问题时,使用
    重塑
    提出了上述解决方案,然后Cris和Luis在评论和聊天中对其进行了改进事实上,没有“直接”方式将此文本作为3D矩阵导入。这是我能想到的最简单的方法:

  • 将输入另存为.txt文件
  • 使用导入工具(变量工具栏中的导入数据按钮)将数据作为Mx2矩阵导入。选择“数字矩阵”作为“输出类型”。您可以使用“空白单元格”来“排除”行,以避免出现空行
  • 除了Reformate()和permute()之外,使用单元格数组按如下方式对其进行格式化可能更直观,也不太容易出错

  • 我认为您必须将其作为2D数组导入,然后使用
    重塑
    置换
    将其导入到需要的位置。只有
    restrape
    才能创建2x1000x2数组,如果您最初将其作为2000x2数组读入。@CrisLuengo我刚刚注意到,
    restrape
    解决方案甚至没有我想象的那么优雅。理想情况下,当数据的格式已经非常接近我想要的格式时,构建3D阵列就不需要太多了!MATLAB没有3D数组的语法,
    cat
    重塑
    是制作3D数组的最简单方法。积极的一面是,您根本不需要修改文本文件,只需将
    data=[
    放在顶部,然后
    ]在底部。可能有人有类似格式的数据,并编写了一个函数将其作为3D数组读取,然后将其发布到文件交换上。正如您所说,解析文本文件并将其解释为3D数组似乎很简单。你只需要有代码就可以这样做,因为MATLAB并不是天生就这样做的。这是一个关于“如何让它看起来更好”的问题吗?如果是这样的话,我怀疑写1000个2x2矩阵不会产生好的代码;)这些矩阵来自哪里?你在反复阅读吗?然后你可以做切片
    Mat3D=NaN(2,21000)
    +循环
    Mat3D(:,:,i)=magic(2)
    谢谢。迄今为止最简单的方法是:
    load('file.txt');排列(重塑(文件“,”2,2,[]),[2 1 3])
    permute(reshape(ideal.',2,2,[]),[2 1 3])
    
    permute(reshape(ideal,2,[],2),[1 3 2])
    
        % The number of 2x2 matrices
        N = size(m,1)/2;
        % Split each 2x2 matrix into a cell
        c = mat2cell(m, 2*ones(1,N), 1);
        % Concatenate along the 3rd dimension
        output3DMatrix = cat(3, c{:});