使用名称和for循环创建一个组合多个变量的矩阵

时间:2014-03-14 19:29:44

标签: matlab

假设我有n个.mat文件,每个文件的命名如下:a1, a2, ..., an

在每个mat文件中都有一个名为var的变量(nxn矩阵)

我想创建一个矩阵:A = [a1.var a2.var, ..., an.var]而不是全部写出来,因为有很多.mat文件

想到了一个for循环,就像这样:

A = []
for i = 1:n 
    [B] = ['a',num2str(i),'.mat',var];
     A = [A B]
end

但这似乎不起作用,甚至对于最简单的情况,我的变量没有存储为(i)而是'a1','a2'等。

非常感谢!

2 个答案:

答案 0 :(得分:1)

加载并连接' var'来自' a(#)。mat':

n = 10;
for i = n:-1:1                       % 1
    file_i = sprintf('a%d.mat', i);  % 2
    t = load(file_i, 'var');
    varsCell{i} = t.var;             % 3
end
A = [varsCell{:}];  % concatenate each 'var' in one step.

以下是对上述代码的一些评论。所有与记忆相关的东西在这里都不是很重要,但在大型项目中要记住这一点。

<强> 1) 在MATLAB中,在for循环期间增长变量很少是一个好主意或必要。每次添加元素时,MATLAB都必须找到并分配一个新的RAM块。这实际上可以减慢速度,特别是对于长循环或大变量。如果可能,请预先分配变量(A = zeros(n,n*n))。或者,它有时可以在循环中向后计数。 MATLAB预先分配整个数组,因为你有效地告诉它最终的大小。

<强> 2) 在这种情况下,等效于file_i = ['a',num2str(i),'.mat']sprintf可以更清晰,更强大。

第3) 存储每个&#39; var&#39;在单元格数组中。这是在将所有需要的内存和索引的复杂性分配到预分配数组的正确位置之间的平衡。在内部,单元格数组是指向每个已加载的“变量”的位置的指针列表。基质


创建测试集......
生成&#39; n&#39; n * n个随机双精度矩阵 将每个保存为&#39; a(#)。mat&#39;在当前目录

for i = 1:n
    var = rand(n);
    save(sprintf('a%d.mat',i), 'var');
end

答案 1 :(得分:0)

<强>代码

%%// The final result, A would have size nX(nXn)
A = zeros(n,n*n); %%// Pre-allocation for better performance
for k =1:n
    load(strcat('a',num2str(k),'.mat'))
    A(1:n,(k-1)*n+1:(k-1)*n+n) = var;
end