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

问题描述

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

0.96875000 0.03125000 
0.03125000 0.96875000

0.96875000 0.01562500 
0.03125000 0.98437500

0.99218800 0.03125000 
0.00781250 0.96875000

我需要在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]

在阅读了MATLAB documentation on multidimensional arraysMATLAB documentation for the cat function之后,我发现可以按照以下方式制作所需的数组(cat的第一个参数是3,因为我正在沿着第3维连接2x2矩阵):

cat(3,...
[0.96875000 0.03125000 
0.03125000 0.96875000],...
[0.96875000 0.01562500 
0.03125000 0.98437500],...
[0.99218800 0.03125000 
0.00781250 0.96875000])

但是,如果像我上面的“理想”示例中那样在行之间设置间距,那行不通,而且我认为对所有逗号和点的需要使它显得更难看。 / p>

在撰写此问题时,我发现可以运行我的“理想”示例,然后使用reshape,相比于使用cat函数解决方案,我更喜欢。为此,我什至不需要分号。然而,Cris Luengo correctly pointed out in the comments认为reshape是不够的,还需要permute,然后Luis Mendo pointed out in chat使得解决方案不是那么简单:

permute(reshape(ideal.',2,[]),[2 1 3])

Andras Deak has done是我们的thought was impossible,它是除去移调的,但是解决方案仍然相当复杂,并且设计起来并不容易:

permute(reshape(ideal,[],2),[1 3 2])

理想情况下,当原始数据已经很好地格式化为人眼已经可以看到的3D数组时,人们就不需要使用catreshape来制作3D数组。 2x2矩阵。

是否可以使用我拥有的格式的数据在MATLAB中构建3D数组的更简单方法

到目前为止,我自己完成了以下操作:

  • 在线搜索并找到了以上两篇MATLAB文档文章,这些文章使我使用cat进入了上述解决方
  • 在编写此问题时使用reshape解决上述问题,然后Cris和Luis在评论和聊天?中对其进行了改进。
  • 也:我尝试将数据保存到.txt文件中,然后在MATLAB中单击import,因为知道导入GUI提供了一些如何在生成的MATLAB数组中组织数据的选项,但是确实做到了使其成为3D阵列似乎没有任何选择。

解决方法

实际上,没有“直接”方式将文本作为3D矩阵导入。这是我想出的最简单的方法:

  1. 将输入另存为.txt文件
  2. 使用导入工具(“变量”工具栏中的“导入数据”按钮)将数据作为Mx2矩阵导入。选择“数值矩阵”作为“输出类型”。而且,您可以使用“空白单元格”“排除行”,以避免出现空行。
  3. 除了reshape()和permute()之外,使用单元格数组将其格式化为以下格式可能更直观,并且不易出错。
    DROP TEMPORARY TABLE IF EXISTS table_2;
    DROP TEMPORARY TABLE IF EXISTS table_3;

-- The final query results from the procedure
    SELECT  ...
    FROM table_1 a
        JOIN stats s ON a.state = s.state 
            AND a.column1 = s.column1
            AND a.column2 = s.column2
    WHERE a.dperiod = DATE_FORMAT(NOW(),'%Y%m')
        AND a.costs < s.avg_costs
    ORDER BY period DESC;