从 Python 代码在 Matlab 中循环创建变量名
Posted
技术标签:
【中文标题】从 Python 代码在 Matlab 中循环创建变量名【英文标题】:Create variable name in loop in Matlab from Python code 【发布时间】:2014-09-02 11:22:30 【问题描述】:我在 Python 中有以下代码,如果可能的话,我想在不使用 eval 语法的情况下在 MATLAB 中实现类似的东西。
重点是从不规则矩阵创建水平和垂直向量并将它们保存为变量。在 python 中,这很简单,但我在不使用 eval 的情况下在 MATLAB 中实现它时遇到了问题。有任何想法吗?非常感谢!
例如在 python 中:
x,y = 3,5
matrix = np.zeros((x,y))
matrix_T = matrix.reshape(y,x)
array_names_y = ['name_y_%d' %i for i in xrange(y)]
array_names_x = ['name_x_%d' %i for i in xrange(x)]
for i in xrange(len(array_names_x)):
for name,row in zip(array_names_x,matrix):
globals()[name]=row
for i in xrange(len(array_names_y)):
for name,column in zip(array_names_y,matrix_T):
globals()[name]=column
输出是这样的:
列:
name_y_0 = [ 0. 0. 0.]
name_y_1 = [ 0. 0. 0.]
name_y_2 = [ 0. 0. 0.]
name_y_3 = [ 0. 0. 0.]
name_y_4 = [ 0. 0. 0.]
rows:
name_x_0 = [ 0. 0. 0. 0. 0.]
name_x_1 = [ 0. 0. 0. 0. 0.]
name_x_2 = [ 0. 0. 0. 0. 0.]
我想这样做以便稍后对每个行/列向量应用分析。
【问题讨论】:
你能解释一下你想要什么吗? ARGH!!! 为什么?!?为什么你会想要那样做?动态创建变量从不是正确的做法。我的建议是:将您的 python 代码更改为 not 与globals()
混淆,然后该代码将几乎 1 对 1 映射到 MATLAB(从而也解决了您提出的问题)。阅读How do I make a series of variables A1, A2, A3, ... A10?
您不能使用元胞数组吗?但是,如果您确实想这样做,那么为什么不使用eval
?正如 Bakuriu 所提到的,这是一个糟糕的主意,但如果您坚持这样做,那么使用 eval
是“正确”的方法。但就像我说的,宁可使用元胞数组或结构体
【参考方案1】:
您可以使用带有动态名称的结构
for ii = 1:size(matrix,1)
nm = sprintf('name_x_%d',ii-1);
st.(nm) = matrix(ii,:);
end
for ii = 1:size(matrix,2)
nm = sprintf('name_y_%d',ii-1);
st.(nm) = matrix(:,ii).';
end
开始
>> matrix = rand(3,5);
你最终得到
>> st
st =
name_x_0: [0.7268 0.3005 0.5994 0.4717 0.0194]
name_x_1: [0.7780 0.3819 0.8218 0.4820 0.3969]
name_x_2: [0.2287 0.6207 0.4578 0.5712 0.2943]
name_y_0: [0.7268 0.7780 0.2287]
name_y_1: [0.3005 0.3819 0.6207]
name_y_2: [0.5994 0.8218 0.4578]
name_y_3: [0.4717 0.4820 0.5712]
name_y_4: [0.0194 0.3969 0.2943]
但是,请请,请,请听Bakuriu。
【讨论】:
投反对票,因为我认为底部的劝阻还不够。对我来说,这没有用。应该强烈反对整个方法。 @Schorsch:但是像这样的struct
不是更类似于元胞数组方法,即使它保留了更有意义的名称而不仅仅是索引?上面@Bakuriu 的 MathWorks 链接提出了类似的方法。还是动态的struct
名称实际上与使用eval
相同?
@horchler 个人偏好,在这里(并且不喜欢匿名投票反对答案)。我认为像st.name1,1.x
或st.name1,1.y
这样的东西更干净。此外,使用从 0
开始的索引(即使只是在名称中)可能会在以后导致混淆,因为 Matlab 不使用 0
-index。
@Schorsch 我理解您对动态字段名称的担忧。但是,关于基于 0 的索引 - 我只是遵循 OP 要求。以上是关于从 Python 代码在 Matlab 中循环创建变量名的主要内容,如果未能解决你的问题,请参考以下文章