问题描述
我每天都会从某人收到一个文本文件,该文本文件的大小为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 arrays和MATLAB 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数组时,人们就不需要使用cat
或reshape
来制作3D数组。 2x2矩阵。
是否可以使用我拥有的格式的数据在MATLAB中构建3D数组的更简单方法?
到目前为止,我自己完成了以下操作:
- 在线搜索并找到了以上两篇MATLAB文档文章,这些文章使我使用
cat
进入了上述解决方案 - 在编写此问题时使用
reshape
来解决上述问题,然后Cris和Luis在评论和聊天?中对其进行了改进。 - 也:我尝试将数据保存到.txt文件中,然后在MATLAB中单击
import
,因为知道导入GUI提供了一些如何在生成的MATLAB数组中组织数据的选项,但是确实做到了使其成为3D阵列似乎没有任何选择。
解决方法
实际上,没有“直接”方式将文本作为3D矩阵导入。这是我想出的最简单的方法:
- 将输入另存为.txt文件
- 使用导入工具(“变量”工具栏中的“导入数据”按钮)将数据作为Mx2矩阵导入。选择“数值矩阵”作为“输出类型”。而且,您可以使用“空白单元格”“排除行”,以避免出现空行。
- 除了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;