Matrix 如何编写Rust宏以将行主顺序转换为列主顺序?
宏将允许您以自然的方式编写任意M x N矩阵。例如:Matrix 如何编写Rust宏以将行主顺序转换为列主顺序?,matrix,rust,macros,Matrix,Rust,Macros,宏将允许您以自然的方式编写任意M x N矩阵。例如: 矩阵![ 1.0, 3.0, 5.0; 2.0, 4.0, 6.0; ] 对应于以下矩阵 ┌ ┐ │ 1.0 3.0 5.0 │ │ 2.0 4.0 6.0 │ └ ┘ 宏将输出一个数组,如下所示: [[1.0,2.0]、[3.0,4.0]、[5.0,6.0]] 我知道我可以非常简单地使用以下命令解析行主顺序。但我如何才能将其转换为列主顺序。我不知道如何切换
矩阵![
1.0, 3.0, 5.0;
2.0, 4.0, 6.0;
]
对应于以下矩阵
┌ ┐
│ 1.0 3.0 5.0 │
│ 2.0 4.0 6.0 │
└ ┘
宏将输出一个数组,如下所示:
[[1.0,2.0]、[3.0,4.0]、[5.0,6.0]]
我知道我可以非常简单地使用以下命令解析行主顺序。但我如何才能将其转换为列主顺序。我不知道如何切换重复组的顺序
macro_rules! matrix {
($($($e:expr),*);*) => {(
[$([$($e),*]),*]
}
}
你去:
只有这样的大小或任何NxM矩阵?任何NxM矩阵,我将在问题中澄清这对于程序宏来说是非常容易的。你可以使用一个,一次读取一个值,然后使用将值累加到每列中。使用Unicode符号制作一个大矩阵的道具。另请参见哇谢谢,这太棒了。为了处理一些边缘情况,我稍微调整了一下解决方案。“你认为还有什么可以简化的吗?我必须添加一条新规则。”罗斯麦克阿瑟看到我更新的答案。
macro_rules! matrix {
($($($v:expr),* );*) => {
matrix!(@phase2 [] $($($v),* );*)
};
(@phase2 [$([$($col:expr),*])*] $($v:expr);* ) => {
[$([$($col),*],)* [$($v),*]]
};
(@phase2 [$([$($col:expr),*])*] $($v0:expr, $($v:expr),* );* $(;)?) => {
matrix!(@phase2 [$([$($col),*]),* [$($v0),*]] $($($v),* );*)
};
}