在循环中更改变量名称

3
这是我的问题的延续 从现有矩阵中提取矩阵。 现在我正在使用以下代码分离这些矩阵(不正确!)

for i = 3:-1:0
    mat = m((sum((m == 0), 2)==i),:)
end

上述部分是对我最初问题的更新
我希望能够相应地命名它,例如

mat1
mat2
mat3
mat4

有人可以提供一个简单的方法来做吗?


2
在大多数情况下,当您需要类似的东西时,最好使用“单元格”。 - Clement J.
6
学会使用 structcell - 你目前的方法会导致编写出很差的代码。 - Jonas
2个回答

10

跟随@Jonas和@Clement-J的建议,这是如何使用cellstruct的方法:

N = 10; % number of matrices
cell_mat = cell(1, N); % pre allocate (good practice)
for ii = 1 : 10
    cell_mat{ii} = rand( ii ); % generate some matrix for "mat"
    struct_mat.( sprintf( 'mat%d', ii ) ) = rand( ii );
end

结构体的好处之一(使用变量字段名)是您可以save它。

save('myMatFile.mat','struct_mat','-struct');

那么您将在mat文件中拥有变量mat1,...,mat10!酷!

一些良好的编程实践:

  1. 在Matlab中预先分配矩阵和数组。在循环内更改变量大小会大大减慢Matlab的运行速度。

  2. 不要使用ij作为循环变量(或作为任何变量),因为它们被Matlab用作sqrt(-1)

  3. 为什么要使用变量名称?您需要有一个非常好的理由来这样做!请描述您想要实现的内容,我相信您会得到更好和更优雅的解决方案......


2
我赞同使用结构来聚合矩阵比创建大量单独变量的想法更好。这里有一篇关于使用动态字段引用的文章链接,你可以阅读一下。http://blogs.mathworks.com/loren/2005/12/13/use-dynamic-field-references/ - tmpearce
@tmpearce - 谢谢你的链接 - 我已经将它添加到回答中了! - Shai

3
这里有一种方法可以使用evalsprintf函数来实现。请参阅这两个函数的文档以了解更多信息。
for count = 1:10
    eval(sprintf('mat%d = zeros(count);',count));
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接