从 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 代码更改为 notglobals() 混淆,然后该代码将几乎 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.xst.name1,1.y 这样的东西更干净。此外,使用从 0 开始的索引(即使只是在名称中)可能会在以后导致混淆,因为 Matlab 不使用 0-index。 @Schorsch 我理解您对动态字段名称的担忧。但是,关于基于 0 的索引 - 我只是遵循 OP 要求。

以上是关于从 Python 代码在 Matlab 中循环创建变量名的主要内容,如果未能解决你的问题,请参考以下文章

Python相当于在Matlab中分配给一个数组(在for循环内)

Matlab for循环,Python中的不同值

从 Python 访问 Matlab 时逃避轮询

Python:循环内的子图:第一个面板出现在错误的位置

Python中range()函数的用法

如何在 Matlab 中循环保存文件?